#include "dat.h"
#include "fns.h"
#include "io.h"
+#include "../port/pci.h"
#include "../port/error.h"
#include "../port/netif.h"
#include "../port/etherif.h"
typedef struct Ctlr Ctlr;
struct Ctlr {
- ulong port;
+ uvlong port;
Pcidev *pcidev;
Ctlr *next;
int active;
case i82577:
case i82577m:
case i82579:
- case i210:
case i217:
case i218:
case i219:
if(c->pcidev->mem[1].bar == 0)
return fload32(c); /* i219 */
- va = vmap(c->pcidev->mem[1].bar & ~0x0f, c->pcidev->mem[1].size);
+ if(c->pcidev->mem[1].bar & 1)
+ return -1;
+
+ va = vmap(c->pcidev->mem[1].bar & ~0xF, c->pcidev->mem[1].size);
if(va == nil)
return -1;
f.reg = va;
case 0x1570: /* i219-v */
case 0x15b8: /* i219-v */
case 0x15b9: /* i219-lm */
+ case 0x15bb: /* i219-lm */
+ case 0x15bd: /* i219-lm */
case 0x15d6: /* i219-v */
case 0x15d7: /* i219-lm */
case 0x15d8: /* i219-v */
case 0x15e3: /* i219-lm */
+ case 0x0d4c: /* i219-lm */
return i219;
case 0x151f: /* i350 “powerville” eeprom-less */
case 0x1521: /* i350 copper */
for(p = nil; p = pcimatch(p, 0x8086, 0);){
hbafixup(p);
+ if(p->mem[0].bar & 1)
+ continue;
if((type = didtype(p->did)) == -1)
continue;
ctlr = malloc(sizeof(Ctlr));
ctlr->type = type;
ctlr->pcidev = p;
ctlr->rbsz = ROUND(cttab[type].mtu, 1024);
- ctlr->port = p->mem[0].bar & ~0x0F;
+ ctlr->port = p->mem[0].bar & ~0xF;
if(i82563ctlrhead != nil)
i82563ctlrtail->next = ctlr;
else
p = ctlr->pcidev;
ctlr->nic = vmap(ctlr->port, p->mem[0].size);
if(ctlr->nic == nil){
- print("%s: can't map 0x%lux\n", cname(ctlr), ctlr->port);
+ print("%s: can't map %llux\n", cname(ctlr), ctlr->port);
return -1;
}
pcienable(p);