25 мая 2011 г.

Танцы на костях или два удара в бубен

Чтобы завести USB-сетевуху D-Link DUB-E100 Rev.B1(т.е. купленную не пять лет назад) на старых ядрах(ещё в 2.6.20 эта проблема вроде присутствует. точнее не скажу), придётся сделать два грязных хака и один удар в бубен.

Удар в бубен:
---
 src/linux-2.6.17/drivers/usb/net/asix.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/src/linux-2.6.17/drivers/usb/net/asix.c b/src/linux-2.6.17/drivers/usb/net/asix.c
index 12b599a..5d5f5d4 100644
--- a/src/linux-2.6.17/drivers/usb/net/asix.c
+++ b/src/linux-2.6.17/drivers/usb/net/asix.c
@@ -872,6 +872,11 @@ static const struct usb_device_id products [] = {
  USB_DEVICE (0x2001, 0x1a00),
  .driver_info =  (unsigned long) &dlink_dub_e100_info,
 }, {
+ // DLink DUB-E100 
+ USB_DEVICE (0x2001, 0x3c05),
+ .driver_info =  (unsigned long) &ax88772_info,
+}, {
+
  // Intellinet, ST Lab USB Ethernet
  USB_DEVICE (0x0b95, 0x1720),
  .driver_info =  (unsigned long) &ax8817x_info,
-- 
Это для того, чтобы устройство вообще определилось в системе.

Хаки:
---
 src/linux-2.6.17/drivers/usb/net/asix.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/linux-2.6.17/drivers/usb/net/asix.c b/src/linux-2.6.17/drivers/usb/net/asix.c
index 5d5f5d4..829c2ef 100644
--- a/src/linux-2.6.17/drivers/usb/net/asix.c
+++ b/src/linux-2.6.17/drivers/usb/net/asix.c
@@ -589,7 +589,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
 
  msleep(5);
  if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT,
-    0x0001, 0, 0, buf)) < 0) {
+    0x0000, 0, 0, buf)) < 0) {
   dbg("Select PHY #1 failed: %d", ret);
   goto out2;
  }
@@ -614,7 +614,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
  if ((ret = asix_read_cmd(dev, AX88772_CMD_READ_NODE_ID,
     0, 0, ETH_ALEN, buf)) < 0) {
   dbg("Failed to read MAC address: %d", ret);
-  goto out2;
+  //goto out2;
  }
  memcpy(dev->net->dev_addr, buf, ETH_ALEN);
 
@@ -625,7 +625,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
           0x0010, 2, 2, buf)) < 0)
    || (*((u16 *)buf) != 0x003b)) {
   dbg("Read PHY register 2 must be 0x3b00: %d", ret);
-  goto out2;
+  //goto out2;
  }
 
  /* Initialize MII structure */
-- 
Тут выкидывается проверка на PHY ID, поскольку ethernet физика стоит на разных ревизиях разная. Плюс меняется что-то для выбора физики. Без этих хаков MAC-уровень заводится нормально, ip присваивается, мак определяется, но физически данные никуда не уходят. Спасибо LKML и людям пишущим в него, за инфу. http://lkml.org/lkml/2006/7/6/132 http://lkml.org/lkml/2007/1/15/156