diff options
Diffstat (limited to 'drivers/net/usb/catc.c')
-rw-r--r-- | drivers/net/usb/catc.c | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/drivers/net/usb/catc.c b/drivers/net/usb/catc.c index 3daa41bdd4ea..0acc9b640419 100644 --- a/drivers/net/usb/catc.c +++ b/drivers/net/usb/catc.c | |||
@@ -776,7 +776,7 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
776 | struct net_device *netdev; | 776 | struct net_device *netdev; |
777 | struct catc *catc; | 777 | struct catc *catc; |
778 | u8 broadcast[ETH_ALEN]; | 778 | u8 broadcast[ETH_ALEN]; |
779 | int i, pktsz; | 779 | int pktsz, ret; |
780 | 780 | ||
781 | if (usb_set_interface(usbdev, | 781 | if (usb_set_interface(usbdev, |
782 | intf->altsetting->desc.bInterfaceNumber, 1)) { | 782 | intf->altsetting->desc.bInterfaceNumber, 1)) { |
@@ -811,12 +811,8 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
811 | if ((!catc->ctrl_urb) || (!catc->tx_urb) || | 811 | if ((!catc->ctrl_urb) || (!catc->tx_urb) || |
812 | (!catc->rx_urb) || (!catc->irq_urb)) { | 812 | (!catc->rx_urb) || (!catc->irq_urb)) { |
813 | dev_err(&intf->dev, "No free urbs available.\n"); | 813 | dev_err(&intf->dev, "No free urbs available.\n"); |
814 | usb_free_urb(catc->ctrl_urb); | 814 | ret = -ENOMEM; |
815 | usb_free_urb(catc->tx_urb); | 815 | goto fail_free; |
816 | usb_free_urb(catc->rx_urb); | ||
817 | usb_free_urb(catc->irq_urb); | ||
818 | free_netdev(netdev); | ||
819 | return -ENOMEM; | ||
820 | } | 816 | } |
821 | 817 | ||
822 | /* The F5U011 has the same vendor/product as the netmate but a device version of 0x130 */ | 818 | /* The F5U011 has the same vendor/product as the netmate but a device version of 0x130 */ |
@@ -844,15 +840,24 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
844 | catc->irq_buf, 2, catc_irq_done, catc, 1); | 840 | catc->irq_buf, 2, catc_irq_done, catc, 1); |
845 | 841 | ||
846 | if (!catc->is_f5u011) { | 842 | if (!catc->is_f5u011) { |
843 | u32 *buf; | ||
844 | int i; | ||
845 | |||
847 | dev_dbg(dev, "Checking memory size\n"); | 846 | dev_dbg(dev, "Checking memory size\n"); |
848 | 847 | ||
849 | i = 0x12345678; | 848 | buf = kmalloc(4, GFP_KERNEL); |
850 | catc_write_mem(catc, 0x7a80, &i, 4); | 849 | if (!buf) { |
851 | i = 0x87654321; | 850 | ret = -ENOMEM; |
852 | catc_write_mem(catc, 0xfa80, &i, 4); | 851 | goto fail_free; |
853 | catc_read_mem(catc, 0x7a80, &i, 4); | 852 | } |
853 | |||
854 | *buf = 0x12345678; | ||
855 | catc_write_mem(catc, 0x7a80, buf, 4); | ||
856 | *buf = 0x87654321; | ||
857 | catc_write_mem(catc, 0xfa80, buf, 4); | ||
858 | catc_read_mem(catc, 0x7a80, buf, 4); | ||
854 | 859 | ||
855 | switch (i) { | 860 | switch (*buf) { |
856 | case 0x12345678: | 861 | case 0x12345678: |
857 | catc_set_reg(catc, TxBufCount, 8); | 862 | catc_set_reg(catc, TxBufCount, 8); |
858 | catc_set_reg(catc, RxBufCount, 32); | 863 | catc_set_reg(catc, RxBufCount, 32); |
@@ -867,6 +872,8 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
867 | dev_dbg(dev, "32k Memory\n"); | 872 | dev_dbg(dev, "32k Memory\n"); |
868 | break; | 873 | break; |
869 | } | 874 | } |
875 | |||
876 | kfree(buf); | ||
870 | 877 | ||
871 | dev_dbg(dev, "Getting MAC from SEEROM.\n"); | 878 | dev_dbg(dev, "Getting MAC from SEEROM.\n"); |
872 | 879 | ||
@@ -913,16 +920,21 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
913 | usb_set_intfdata(intf, catc); | 920 | usb_set_intfdata(intf, catc); |
914 | 921 | ||
915 | SET_NETDEV_DEV(netdev, &intf->dev); | 922 | SET_NETDEV_DEV(netdev, &intf->dev); |
916 | if (register_netdev(netdev) != 0) { | 923 | ret = register_netdev(netdev); |
917 | usb_set_intfdata(intf, NULL); | 924 | if (ret) |
918 | usb_free_urb(catc->ctrl_urb); | 925 | goto fail_clear_intfdata; |
919 | usb_free_urb(catc->tx_urb); | 926 | |
920 | usb_free_urb(catc->rx_urb); | ||
921 | usb_free_urb(catc->irq_urb); | ||
922 | free_netdev(netdev); | ||
923 | return -EIO; | ||
924 | } | ||
925 | return 0; | 927 | return 0; |
928 | |||
929 | fail_clear_intfdata: | ||
930 | usb_set_intfdata(intf, NULL); | ||
931 | fail_free: | ||
932 | usb_free_urb(catc->ctrl_urb); | ||
933 | usb_free_urb(catc->tx_urb); | ||
934 | usb_free_urb(catc->rx_urb); | ||
935 | usb_free_urb(catc->irq_urb); | ||
936 | free_netdev(netdev); | ||
937 | return ret; | ||
926 | } | 938 | } |
927 | 939 | ||
928 | static void catc_disconnect(struct usb_interface *intf) | 940 | static void catc_disconnect(struct usb_interface *intf) |