Linksys EG1032 rev. 3 patch
Fredrik Lindberg
fli+freebsd-current at shapeshifter.se
Wed Oct 5 05:22:48 PDT 2005
M. Warner Losh wrote:
> In message: <43424F75.3000409 at shapeshifter.se>
> Fredrik Lindberg <fli at shapeshifter.se> writes:
> : M. Warner Losh wrote:
> : > In message: <4341A55B.1070209 at shapeshifter.se>
> : > Fredrik Lindberg <fli+freebsd-current at shapeshifter.se> writes:
> : > : Filtering on subvendor/subdevice might be better, I didn't even think
> : > : of that and revision filtering seemed to be quite popular among
> : > : exsisting drivers.
> : >
> : > Yes. Many chip vendors bump the revision field 'often'. Just how
> : > often varies from chip maker to chip maker. Some do only when they
> : > have a new version of the chip that needs special work arounds (or
> : > that no longer needs them :-). Others do change it for each change to
> : > the silicon. Most are somewhere inbetween.
> : >
> : > : The subdevice id for a rev.3 card seems to be 0x0024 (subvendor 0x1737).
> : > : I don't own a rev. 2 card but google says that the rev.2 card has
> : > : subdevice id 0x0015 (subvendor 0x1737).
> : >
> : > That might be sufficient...
> : >
> :
> : Ok, how should this be implemented then? Just a specific check in each
> : drivers probe methods or by adding some svid/sdid fields to
> : struct rl_type and similar structs.
> : I would go for the latter, but that might be overkill.
>
> I'd code it as a special case in re and sk driver's probe routine for
> the moment. If more of these cards surface, then doing something more
> general might be a good idea.
>
> Warner
Ok, here is something that probes for subdevice. Somebody with a
rev. 2 card needs to test this and confirm that sk(4)
still attaches successfully to those cards.
Fredrik
-------------- next part --------------
Index: dev/re/if_re.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/re/if_re.c,v
retrieving revision 1.57
diff -u -r1.57 if_re.c
--- dev/re/if_re.c 5 Oct 2005 10:09:15 -0000 1.57
+++ dev/re/if_re.c 5 Oct 2005 12:21:32 -0000
@@ -177,6 +177,8 @@
"RealTek 8110S Single-chip Gigabit Ethernet" },
{ COREGA_VENDORID, COREGA_DEVICEID_CGLAPCIGT, RL_HWREV_8169S,
"Corega CG-LAPCIGT (RTL8169S) Gigabit Ethernet" },
+ { LINKSYS_VENDORID, LINKSYS_DEVICEID_EG1032, RL_HWREV_8169S,
+ "Linksys EG1032 (RTL8169S) Gigabit Ethernet" },
{ 0, 0, 0, NULL }
};
@@ -826,6 +828,17 @@
while (t->rl_name != NULL) {
if ((pci_get_vendor(dev) == t->rl_vid) &&
(pci_get_device(dev) == t->rl_did)) {
+ /*
+ * Only attach to rev. 3 of the Linksys EG1032 adapter.
+ * Rev. 2 i supported by sk(4).
+ */
+ if ((t->rl_vid == LINKSYS_VENDORID) &&
+ (t->rl_did == LINKSYS_DEVICEID_EG1032) &&
+ (pci_get_subdevice(dev) !=
+ LINKSYS_SUBDEVICE_EG1032_REV3)) {
+ t++;
+ continue;
+ }
/*
* Temporarily map the I/O space
Index: pci/if_rlreg.h
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_rlreg.h,v
retrieving revision 1.53
diff -u -r1.53 if_rlreg.h
--- pci/if_rlreg.h 29 Sep 2005 16:52:19 -0000 1.53
+++ pci/if_rlreg.h 5 Oct 2005 12:21:32 -0000
@@ -825,6 +825,21 @@
#define COREGA_DEVICEID_CGLAPCIGT 0xc107
/*
+ * Linksys vendor ID
+ */
+#define LINKSYS_VENDORID 0x1737
+
+/*
+ * Linksys EG1032 device ID
+ */
+#define LINKSYS_DEVICEID_EG1032 0x1032
+
+/*
+ * Linksys EG1032 rev 3 sub-device ID
+ */
+#define LINKSYS_SUBDEVICE_EG1032_REV3 0x0024
+
+/*
* Peppercon vendor ID
*/
#define PEPPERCON_VENDORID 0x1743
Index: pci/if_sk.c
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_sk.c,v
retrieving revision 1.110
diff -u -r1.110 if_sk.c
--- pci/if_sk.c 16 Sep 2005 11:11:51 -0000 1.110
+++ pci/if_sk.c 5 Oct 2005 12:21:33 -0000
@@ -1312,6 +1312,17 @@
while(t->sk_name != NULL) {
if ((pci_get_vendor(dev) == t->sk_vid) &&
(pci_get_device(dev) == t->sk_did)) {
+ /*
+ * Only attach to rev. 2 of the Linksys EG1032 adapter.
+ * Rev. 3 is supported by re(4).
+ */
+ if ((t->sk_vid == VENDORID_LINKSYS) &&
+ (t->sk_did == DEVICEID_LINKSYS_EG1032) &&
+ (pci_get_subdevice(dev) !=
+ SUBDEVICEID_LINKSYS_EG1032_REV2)) {
+ t++;
+ continue;
+ }
device_set_desc(dev, t->sk_name);
return (BUS_PROBE_DEFAULT);
}
Index: pci/if_skreg.h
===================================================================
RCS file: /home/ncvs/src/sys/pci/if_skreg.h,v
retrieving revision 1.29
diff -u -r1.29 if_skreg.h
--- pci/if_skreg.h 10 Jun 2005 16:49:23 -0000 1.29
+++ pci/if_skreg.h 5 Oct 2005 12:21:33 -0000
@@ -104,6 +104,11 @@
#define DEVICEID_LINKSYS_EG1032 0x1032
/*
+ * Linksys gigabit ethernet rev 2 sub-device ID
+ */
+#define SUBDEVICEID_LINKSYS_EG1032_REV2 0x0015
+
+/*
* D-Link PCI vendor ID
*/
#define VENDORID_DLINK 0x1186
More information about the freebsd-current
mailing list