Loading drivers/net/usb/r8152.c +63 −39 Original line number Diff line number Diff line Loading @@ -4236,44 +4236,6 @@ static const struct net_device_ops rtl8152_netdev_ops = { .ndo_features_check = rtl8152_features_check, }; static void r8152b_get_version(struct r8152 *tp) { u32 ocp_data; u16 version; ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR1); version = (u16)(ocp_data & VERSION_MASK); switch (version) { case 0x4c00: tp->version = RTL_VER_01; break; case 0x4c10: tp->version = RTL_VER_02; break; case 0x5c00: tp->version = RTL_VER_03; tp->mii.supports_gmii = 1; break; case 0x5c10: tp->version = RTL_VER_04; tp->mii.supports_gmii = 1; break; case 0x5c20: tp->version = RTL_VER_05; tp->mii.supports_gmii = 1; break; case 0x5c30: tp->version = RTL_VER_06; tp->mii.supports_gmii = 1; break; default: netif_info(tp, probe, tp->netdev, "Unknown version 0x%04x\n", version); break; } } static void rtl8152_unload(struct r8152 *tp) { if (test_bit(RTL8152_UNPLUG, &tp->flags)) Loading Loading @@ -4338,14 +4300,66 @@ static int rtl_ops_init(struct r8152 *tp) return ret; } static u8 rtl_get_version(struct usb_interface *intf) { struct usb_device *udev = interface_to_usbdev(intf); u32 ocp_data = 0; __le32 *tmp; u8 version; int ret; tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); if (!tmp) return 0; ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500); if (ret > 0) ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK; kfree(tmp); switch (ocp_data) { case 0x4c00: version = RTL_VER_01; break; case 0x4c10: version = RTL_VER_02; break; case 0x5c00: version = RTL_VER_03; break; case 0x5c10: version = RTL_VER_04; break; case 0x5c20: version = RTL_VER_05; break; case 0x5c30: version = RTL_VER_06; break; default: version = RTL_VER_UNKNOWN; dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data); break; } return version; } static int rtl8152_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *udev = interface_to_usbdev(intf); u8 version = rtl_get_version(intf); struct r8152 *tp; struct net_device *netdev; int ret; if (version == RTL_VER_UNKNOWN) return -ENODEV; if (udev->actconfig->desc.bConfigurationValue != 1) { usb_driver_set_configuration(udev, 1); return -ENODEV; Loading @@ -4365,8 +4379,18 @@ static int rtl8152_probe(struct usb_interface *intf, tp->udev = udev; tp->netdev = netdev; tp->intf = intf; tp->version = version; switch (version) { case RTL_VER_01: case RTL_VER_02: tp->mii.supports_gmii = 0; break; default: tp->mii.supports_gmii = 1; break; } r8152b_get_version(tp); ret = rtl_ops_init(tp); if (ret) goto out; Loading Loading
drivers/net/usb/r8152.c +63 −39 Original line number Diff line number Diff line Loading @@ -4236,44 +4236,6 @@ static const struct net_device_ops rtl8152_netdev_ops = { .ndo_features_check = rtl8152_features_check, }; static void r8152b_get_version(struct r8152 *tp) { u32 ocp_data; u16 version; ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR1); version = (u16)(ocp_data & VERSION_MASK); switch (version) { case 0x4c00: tp->version = RTL_VER_01; break; case 0x4c10: tp->version = RTL_VER_02; break; case 0x5c00: tp->version = RTL_VER_03; tp->mii.supports_gmii = 1; break; case 0x5c10: tp->version = RTL_VER_04; tp->mii.supports_gmii = 1; break; case 0x5c20: tp->version = RTL_VER_05; tp->mii.supports_gmii = 1; break; case 0x5c30: tp->version = RTL_VER_06; tp->mii.supports_gmii = 1; break; default: netif_info(tp, probe, tp->netdev, "Unknown version 0x%04x\n", version); break; } } static void rtl8152_unload(struct r8152 *tp) { if (test_bit(RTL8152_UNPLUG, &tp->flags)) Loading Loading @@ -4338,14 +4300,66 @@ static int rtl_ops_init(struct r8152 *tp) return ret; } static u8 rtl_get_version(struct usb_interface *intf) { struct usb_device *udev = interface_to_usbdev(intf); u32 ocp_data = 0; __le32 *tmp; u8 version; int ret; tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); if (!tmp) return 0; ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500); if (ret > 0) ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK; kfree(tmp); switch (ocp_data) { case 0x4c00: version = RTL_VER_01; break; case 0x4c10: version = RTL_VER_02; break; case 0x5c00: version = RTL_VER_03; break; case 0x5c10: version = RTL_VER_04; break; case 0x5c20: version = RTL_VER_05; break; case 0x5c30: version = RTL_VER_06; break; default: version = RTL_VER_UNKNOWN; dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data); break; } return version; } static int rtl8152_probe(struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *udev = interface_to_usbdev(intf); u8 version = rtl_get_version(intf); struct r8152 *tp; struct net_device *netdev; int ret; if (version == RTL_VER_UNKNOWN) return -ENODEV; if (udev->actconfig->desc.bConfigurationValue != 1) { usb_driver_set_configuration(udev, 1); return -ENODEV; Loading @@ -4365,8 +4379,18 @@ static int rtl8152_probe(struct usb_interface *intf, tp->udev = udev; tp->netdev = netdev; tp->intf = intf; tp->version = version; switch (version) { case RTL_VER_01: case RTL_VER_02: tp->mii.supports_gmii = 0; break; default: tp->mii.supports_gmii = 1; break; } r8152b_get_version(tp); ret = rtl_ops_init(tp); if (ret) goto out; Loading