ref: 19f749f359ad1ea12315c6f0fc2b76644ee64f96
parent: ab916bc831b8a68da981bfc79c94ef721be3bb4e
author: Aidan K. Wiggins <akw@oneiri.one>
date: Sun Oct 26 21:29:15 EDT 2025
nusb/ether/asix.c: use phy status register for checking link
--- a/sys/src/cmd/nusb/ether/asix.c
+++ b/sys/src/cmd/nusb/ether/asix.c
@@ -422,9 +422,9 @@
Nid = 0x10,
Aphy = 0x02,
- Physts = 0x02,
+ Phyusb = 0x02,
Phyid = 0x03,
- Phyfd = 0x11,
+ Physr = 0x11,
/* Control */
Crxctl = 0x0b,
@@ -447,15 +447,18 @@
Cpwtrh = 0x55,
Capo = 0x91, /* auto-power off phy */
- /* USB/Link conn. */
+ /* Phy link */
+ Linkup = 0x0400,
+ Linkfd = 0x2000,
+ Link10 = 0x0000,
+ Link100 = 0x4000,
+ Link1000 = 0x8000,
+ Linkmask = Link10 | Link100 | Link1000,
+
+ /* USB conn. */
Usbfs = 0x01,
Usbhs = 0x02,
Usbss = 0x04,
- Link10 = 0x10,
- Link100 = 0x20,
- Link1000 = 0x40,
-
- Linkfd = 0x2000,
};
static int
@@ -592,16 +595,16 @@
a179linkup(Dev *d)
{int timeout;
- ushort link;
+ int link;
timeout = 5000;
do{- link = a179miiread(d, Miibmsr);
- if(link & Bmsrlink)
+ if((link = a179miiread(d, Physr)) < 0)
+ return -1;
+ if(link & Linkup)
return 0;
sleep(50);
}while(timeout -= 50);
-
fprint(2, "%s: a179linkup: no link\n", argv0);
return -1;
}
@@ -635,15 +638,18 @@
static int
a179linkspeed(Dev *d)
{- uchar link;
+ int link;
- a179get(d, Amac, Physts, 1, &link, 1);
- if(link & Link1000)
+ if((link = a179miiread(d, Physr)) < 0)
+ return -1;
+ switch(link & Linkmask){+ case Link1000:
return 1000;
- if(link & Link100)
+ case Link100:
return 100;
- if(link & Link10)
+ case Link10:
return 10;
+ }
return 0;
}
@@ -656,9 +662,10 @@
{0x07, 0xae, 0x07, 0x04, 0xff}, {0x07, 0xcc, 0x4c, 0x04, 0x08}};
- ushort mode, fd;
- uchar link;
+ ushort mode;
+ uchar usbspd;
int spd;
+ int link;
a179set2(d, Cphy, 0);
a179set2(d, Cphy, Cphyiprl);
@@ -684,24 +691,29 @@
spd = 3; /* default bulkinq */
mode = Mtfc | Mrfc | Mre;
- a179get(d, Amac, Physts, 1, &link, 1);
- if(link & Link1000){+ if(a179get(d, Amac, Phyusb, 1, &usbspd, 1) < 0)
+ return -1;
+ if((link = a179miiread(d, Physr)) < 0)
+ return -1;
+ switch(link & Linkmask){+ case Link1000:
mode |= Mgm|Mmhz|Mjfe|Munk;
- if(link & Usbss)
+ if(usbspd & Usbss)
spd = 0;
- else if(link & Usbhs)
+ else if(usbspd & Usbhs)
spd = 1;
- }else if(link & Link100){+ break;
+ case Link100:
mode |= Mps;
- if(link & (Usbss|Usbhs))
+ if(usbspd & (Usbss|Usbhs))
spd = 2;
- } /* Link10 */
+ case Link10:
+ break;
+ }
a179set(d, Amac, Cblkinq, 5, qctrl[spd], 5);
a179bufsz = 1024*(qctrl[spd][3]+2);
- fd = a179miiread(d, Phyfd);
- if(fd & Linkfd)
+ if(link & Linkfd)
mode |= Mfd;
-
if(a179set2(d, Cmed, mode) < 0)
return -1;
@@ -710,6 +722,5 @@
eppromiscuous = a179promiscuous;
epmulticast = a179multicast;
eplinkspeed = a179linkspeed;
-
return 0;
}
--
⑨