diff options
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/usb.c')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/usb.c | 270 |
1 files changed, 86 insertions, 184 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c index 24f65cd53859..6db51a666f61 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <dhd_bus.h> | 25 | #include <dhd_bus.h> |
26 | #include <dhd_dbg.h> | 26 | #include <dhd_dbg.h> |
27 | 27 | ||
28 | #include "firmware.h" | ||
28 | #include "usb_rdl.h" | 29 | #include "usb_rdl.h" |
29 | #include "usb.h" | 30 | #include "usb.h" |
30 | 31 | ||
@@ -61,12 +62,6 @@ struct brcmf_usb_image { | |||
61 | u8 *image; | 62 | u8 *image; |
62 | int image_len; | 63 | int image_len; |
63 | }; | 64 | }; |
64 | static struct list_head fw_image_list; | ||
65 | |||
66 | struct intr_transfer_buf { | ||
67 | u32 notification; | ||
68 | u32 reserved; | ||
69 | }; | ||
70 | 65 | ||
71 | struct brcmf_usbdev_info { | 66 | struct brcmf_usbdev_info { |
72 | struct brcmf_usbdev bus_pub; /* MUST BE FIRST */ | 67 | struct brcmf_usbdev bus_pub; /* MUST BE FIRST */ |
@@ -75,7 +70,7 @@ struct brcmf_usbdev_info { | |||
75 | struct list_head rx_postq; | 70 | struct list_head rx_postq; |
76 | struct list_head tx_freeq; | 71 | struct list_head tx_freeq; |
77 | struct list_head tx_postq; | 72 | struct list_head tx_postq; |
78 | uint rx_pipe, tx_pipe, intr_pipe, rx_pipe2; | 73 | uint rx_pipe, tx_pipe, rx_pipe2; |
79 | 74 | ||
80 | int rx_low_watermark; | 75 | int rx_low_watermark; |
81 | int tx_low_watermark; | 76 | int tx_low_watermark; |
@@ -87,7 +82,7 @@ struct brcmf_usbdev_info { | |||
87 | struct brcmf_usbreq *tx_reqs; | 82 | struct brcmf_usbreq *tx_reqs; |
88 | struct brcmf_usbreq *rx_reqs; | 83 | struct brcmf_usbreq *rx_reqs; |
89 | 84 | ||
90 | u8 *image; /* buffer for combine fw and nvram */ | 85 | const u8 *image; /* buffer for combine fw and nvram */ |
91 | int image_len; | 86 | int image_len; |
92 | 87 | ||
93 | struct usb_device *usbdev; | 88 | struct usb_device *usbdev; |
@@ -104,10 +99,6 @@ struct brcmf_usbdev_info { | |||
104 | ulong ctl_op; | 99 | ulong ctl_op; |
105 | 100 | ||
106 | struct urb *bulk_urb; /* used for FW download */ | 101 | struct urb *bulk_urb; /* used for FW download */ |
107 | struct urb *intr_urb; /* URB for interrupt endpoint */ | ||
108 | int intr_size; /* Size of interrupt message */ | ||
109 | int interval; /* Interrupt polling interval */ | ||
110 | struct intr_transfer_buf intr; /* Data buffer for interrupt endpoint */ | ||
111 | }; | 102 | }; |
112 | 103 | ||
113 | static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo, | 104 | static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo, |
@@ -531,39 +522,6 @@ brcmf_usb_state_change(struct brcmf_usbdev_info *devinfo, int state) | |||
531 | } | 522 | } |
532 | } | 523 | } |
533 | 524 | ||
534 | static void | ||
535 | brcmf_usb_intr_complete(struct urb *urb) | ||
536 | { | ||
537 | struct brcmf_usbdev_info *devinfo = | ||
538 | (struct brcmf_usbdev_info *)urb->context; | ||
539 | int err; | ||
540 | |||
541 | brcmf_dbg(USB, "Enter, urb->status=%d\n", urb->status); | ||
542 | |||
543 | if (devinfo == NULL) | ||
544 | return; | ||
545 | |||
546 | if (unlikely(urb->status)) { | ||
547 | if (urb->status == -ENOENT || | ||
548 | urb->status == -ESHUTDOWN || | ||
549 | urb->status == -ENODEV) { | ||
550 | brcmf_usb_state_change(devinfo, | ||
551 | BRCMFMAC_USB_STATE_DOWN); | ||
552 | } | ||
553 | } | ||
554 | |||
555 | if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_DOWN) { | ||
556 | brcmf_err("intr cb when DBUS down, ignoring\n"); | ||
557 | return; | ||
558 | } | ||
559 | |||
560 | if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) { | ||
561 | err = usb_submit_urb(devinfo->intr_urb, GFP_ATOMIC); | ||
562 | if (err) | ||
563 | brcmf_err("usb_submit_urb, err=%d\n", err); | ||
564 | } | ||
565 | } | ||
566 | |||
567 | static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb) | 525 | static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb) |
568 | { | 526 | { |
569 | struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev); | 527 | struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev); |
@@ -619,7 +577,6 @@ static int brcmf_usb_up(struct device *dev) | |||
619 | { | 577 | { |
620 | struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev); | 578 | struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev); |
621 | u16 ifnum; | 579 | u16 ifnum; |
622 | int ret; | ||
623 | 580 | ||
624 | brcmf_dbg(USB, "Enter\n"); | 581 | brcmf_dbg(USB, "Enter\n"); |
625 | if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) | 582 | if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) |
@@ -628,23 +585,6 @@ static int brcmf_usb_up(struct device *dev) | |||
628 | /* Success, indicate devinfo is fully up */ | 585 | /* Success, indicate devinfo is fully up */ |
629 | brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_UP); | 586 | brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_UP); |
630 | 587 | ||
631 | if (devinfo->intr_urb) { | ||
632 | usb_fill_int_urb(devinfo->intr_urb, devinfo->usbdev, | ||
633 | devinfo->intr_pipe, | ||
634 | &devinfo->intr, | ||
635 | devinfo->intr_size, | ||
636 | (usb_complete_t)brcmf_usb_intr_complete, | ||
637 | devinfo, | ||
638 | devinfo->interval); | ||
639 | |||
640 | ret = usb_submit_urb(devinfo->intr_urb, GFP_ATOMIC); | ||
641 | if (ret) { | ||
642 | brcmf_err("USB_SUBMIT_URB failed with status %d\n", | ||
643 | ret); | ||
644 | return -EINVAL; | ||
645 | } | ||
646 | } | ||
647 | |||
648 | if (devinfo->ctl_urb) { | 588 | if (devinfo->ctl_urb) { |
649 | devinfo->ctl_in_pipe = usb_rcvctrlpipe(devinfo->usbdev, 0); | 589 | devinfo->ctl_in_pipe = usb_rcvctrlpipe(devinfo->usbdev, 0); |
650 | devinfo->ctl_out_pipe = usb_sndctrlpipe(devinfo->usbdev, 0); | 590 | devinfo->ctl_out_pipe = usb_sndctrlpipe(devinfo->usbdev, 0); |
@@ -681,8 +621,6 @@ static void brcmf_usb_down(struct device *dev) | |||
681 | return; | 621 | return; |
682 | 622 | ||
683 | brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_DOWN); | 623 | brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_DOWN); |
684 | if (devinfo->intr_urb) | ||
685 | usb_kill_urb(devinfo->intr_urb); | ||
686 | 624 | ||
687 | if (devinfo->ctl_urb) | 625 | if (devinfo->ctl_urb) |
688 | usb_kill_urb(devinfo->ctl_urb); | 626 | usb_kill_urb(devinfo->ctl_urb); |
@@ -1021,7 +959,7 @@ brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo) | |||
1021 | } | 959 | } |
1022 | 960 | ||
1023 | err = brcmf_usb_dlstart(devinfo, | 961 | err = brcmf_usb_dlstart(devinfo, |
1024 | devinfo->image, devinfo->image_len); | 962 | (u8 *)devinfo->image, devinfo->image_len); |
1025 | if (err == 0) | 963 | if (err == 0) |
1026 | err = brcmf_usb_dlrun(devinfo); | 964 | err = brcmf_usb_dlrun(devinfo); |
1027 | return err; | 965 | return err; |
@@ -1036,7 +974,6 @@ static void brcmf_usb_detach(struct brcmf_usbdev_info *devinfo) | |||
1036 | brcmf_usb_free_q(&devinfo->rx_freeq, false); | 974 | brcmf_usb_free_q(&devinfo->rx_freeq, false); |
1037 | brcmf_usb_free_q(&devinfo->tx_freeq, false); | 975 | brcmf_usb_free_q(&devinfo->tx_freeq, false); |
1038 | 976 | ||
1039 | usb_free_urb(devinfo->intr_urb); | ||
1040 | usb_free_urb(devinfo->ctl_urb); | 977 | usb_free_urb(devinfo->ctl_urb); |
1041 | usb_free_urb(devinfo->bulk_urb); | 978 | usb_free_urb(devinfo->bulk_urb); |
1042 | 979 | ||
@@ -1080,68 +1017,20 @@ static int check_file(const u8 *headers) | |||
1080 | return -1; | 1017 | return -1; |
1081 | } | 1018 | } |
1082 | 1019 | ||
1083 | static int brcmf_usb_get_fw(struct brcmf_usbdev_info *devinfo) | 1020 | static const char *brcmf_usb_get_fwname(struct brcmf_usbdev_info *devinfo) |
1084 | { | 1021 | { |
1085 | s8 *fwname; | ||
1086 | const struct firmware *fw; | ||
1087 | struct brcmf_usb_image *fw_image; | ||
1088 | int err; | ||
1089 | |||
1090 | brcmf_dbg(USB, "Enter\n"); | ||
1091 | switch (devinfo->bus_pub.devid) { | 1022 | switch (devinfo->bus_pub.devid) { |
1092 | case 43143: | 1023 | case 43143: |
1093 | fwname = BRCMF_USB_43143_FW_NAME; | 1024 | return BRCMF_USB_43143_FW_NAME; |
1094 | break; | ||
1095 | case 43235: | 1025 | case 43235: |
1096 | case 43236: | 1026 | case 43236: |
1097 | case 43238: | 1027 | case 43238: |
1098 | fwname = BRCMF_USB_43236_FW_NAME; | 1028 | return BRCMF_USB_43236_FW_NAME; |
1099 | break; | ||
1100 | case 43242: | 1029 | case 43242: |
1101 | fwname = BRCMF_USB_43242_FW_NAME; | 1030 | return BRCMF_USB_43242_FW_NAME; |
1102 | break; | ||
1103 | default: | 1031 | default: |
1104 | return -EINVAL; | 1032 | return NULL; |
1105 | break; | ||
1106 | } | ||
1107 | brcmf_dbg(USB, "Loading FW %s\n", fwname); | ||
1108 | list_for_each_entry(fw_image, &fw_image_list, list) { | ||
1109 | if (fw_image->fwname == fwname) { | ||
1110 | devinfo->image = fw_image->image; | ||
1111 | devinfo->image_len = fw_image->image_len; | ||
1112 | return 0; | ||
1113 | } | ||
1114 | } | ||
1115 | /* fw image not yet loaded. Load it now and add to list */ | ||
1116 | err = request_firmware(&fw, fwname, devinfo->dev); | ||
1117 | if (!fw) { | ||
1118 | brcmf_err("fail to request firmware %s\n", fwname); | ||
1119 | return err; | ||
1120 | } | ||
1121 | if (check_file(fw->data) < 0) { | ||
1122 | brcmf_err("invalid firmware %s\n", fwname); | ||
1123 | return -EINVAL; | ||
1124 | } | 1033 | } |
1125 | |||
1126 | fw_image = kzalloc(sizeof(*fw_image), GFP_ATOMIC); | ||
1127 | if (!fw_image) | ||
1128 | return -ENOMEM; | ||
1129 | INIT_LIST_HEAD(&fw_image->list); | ||
1130 | list_add_tail(&fw_image->list, &fw_image_list); | ||
1131 | fw_image->fwname = fwname; | ||
1132 | fw_image->image = vmalloc(fw->size); | ||
1133 | if (!fw_image->image) | ||
1134 | return -ENOMEM; | ||
1135 | |||
1136 | memcpy(fw_image->image, fw->data, fw->size); | ||
1137 | fw_image->image_len = fw->size; | ||
1138 | |||
1139 | release_firmware(fw); | ||
1140 | |||
1141 | devinfo->image = fw_image->image; | ||
1142 | devinfo->image_len = fw_image->image_len; | ||
1143 | |||
1144 | return 0; | ||
1145 | } | 1034 | } |
1146 | 1035 | ||
1147 | 1036 | ||
@@ -1186,11 +1075,6 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo, | |||
1186 | goto error; | 1075 | goto error; |
1187 | devinfo->tx_freecount = ntxq; | 1076 | devinfo->tx_freecount = ntxq; |
1188 | 1077 | ||
1189 | devinfo->intr_urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
1190 | if (!devinfo->intr_urb) { | ||
1191 | brcmf_err("usb_alloc_urb (intr) failed\n"); | ||
1192 | goto error; | ||
1193 | } | ||
1194 | devinfo->ctl_urb = usb_alloc_urb(0, GFP_ATOMIC); | 1078 | devinfo->ctl_urb = usb_alloc_urb(0, GFP_ATOMIC); |
1195 | if (!devinfo->ctl_urb) { | 1079 | if (!devinfo->ctl_urb) { |
1196 | brcmf_err("usb_alloc_urb (ctl) failed\n"); | 1080 | brcmf_err("usb_alloc_urb (ctl) failed\n"); |
@@ -1202,16 +1086,6 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo, | |||
1202 | goto error; | 1086 | goto error; |
1203 | } | 1087 | } |
1204 | 1088 | ||
1205 | if (!brcmf_usb_dlneeded(devinfo)) | ||
1206 | return &devinfo->bus_pub; | ||
1207 | |||
1208 | brcmf_dbg(USB, "Start fw downloading\n"); | ||
1209 | if (brcmf_usb_get_fw(devinfo)) | ||
1210 | goto error; | ||
1211 | |||
1212 | if (brcmf_usb_fw_download(devinfo)) | ||
1213 | goto error; | ||
1214 | |||
1215 | return &devinfo->bus_pub; | 1089 | return &devinfo->bus_pub; |
1216 | 1090 | ||
1217 | error: | 1091 | error: |
@@ -1222,18 +1096,77 @@ error: | |||
1222 | 1096 | ||
1223 | static struct brcmf_bus_ops brcmf_usb_bus_ops = { | 1097 | static struct brcmf_bus_ops brcmf_usb_bus_ops = { |
1224 | .txdata = brcmf_usb_tx, | 1098 | .txdata = brcmf_usb_tx, |
1225 | .init = brcmf_usb_up, | ||
1226 | .stop = brcmf_usb_down, | 1099 | .stop = brcmf_usb_down, |
1227 | .txctl = brcmf_usb_tx_ctlpkt, | 1100 | .txctl = brcmf_usb_tx_ctlpkt, |
1228 | .rxctl = brcmf_usb_rx_ctlpkt, | 1101 | .rxctl = brcmf_usb_rx_ctlpkt, |
1229 | }; | 1102 | }; |
1230 | 1103 | ||
1104 | static int brcmf_usb_bus_setup(struct brcmf_usbdev_info *devinfo) | ||
1105 | { | ||
1106 | int ret; | ||
1107 | |||
1108 | /* Attach to the common driver interface */ | ||
1109 | ret = brcmf_attach(devinfo->dev); | ||
1110 | if (ret) { | ||
1111 | brcmf_err("brcmf_attach failed\n"); | ||
1112 | return ret; | ||
1113 | } | ||
1114 | |||
1115 | ret = brcmf_usb_up(devinfo->dev); | ||
1116 | if (ret) | ||
1117 | goto fail; | ||
1118 | |||
1119 | ret = brcmf_bus_start(devinfo->dev); | ||
1120 | if (ret) | ||
1121 | goto fail; | ||
1122 | |||
1123 | return 0; | ||
1124 | fail: | ||
1125 | brcmf_detach(devinfo->dev); | ||
1126 | return ret; | ||
1127 | } | ||
1128 | |||
1129 | static void brcmf_usb_probe_phase2(struct device *dev, | ||
1130 | const struct firmware *fw, | ||
1131 | void *nvram, u32 nvlen) | ||
1132 | { | ||
1133 | struct brcmf_bus *bus = dev_get_drvdata(dev); | ||
1134 | struct brcmf_usbdev_info *devinfo; | ||
1135 | int ret; | ||
1136 | |||
1137 | brcmf_dbg(USB, "Start fw downloading\n"); | ||
1138 | ret = check_file(fw->data); | ||
1139 | if (ret < 0) { | ||
1140 | brcmf_err("invalid firmware\n"); | ||
1141 | release_firmware(fw); | ||
1142 | goto error; | ||
1143 | } | ||
1144 | |||
1145 | devinfo = bus->bus_priv.usb->devinfo; | ||
1146 | devinfo->image = fw->data; | ||
1147 | devinfo->image_len = fw->size; | ||
1148 | |||
1149 | ret = brcmf_usb_fw_download(devinfo); | ||
1150 | release_firmware(fw); | ||
1151 | if (ret) | ||
1152 | goto error; | ||
1153 | |||
1154 | ret = brcmf_usb_bus_setup(devinfo); | ||
1155 | if (ret) | ||
1156 | goto error; | ||
1157 | |||
1158 | return; | ||
1159 | error: | ||
1160 | brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), ret); | ||
1161 | device_release_driver(dev); | ||
1162 | } | ||
1163 | |||
1231 | static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) | 1164 | static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) |
1232 | { | 1165 | { |
1233 | struct brcmf_bus *bus = NULL; | 1166 | struct brcmf_bus *bus = NULL; |
1234 | struct brcmf_usbdev *bus_pub = NULL; | 1167 | struct brcmf_usbdev *bus_pub = NULL; |
1235 | int ret; | ||
1236 | struct device *dev = devinfo->dev; | 1168 | struct device *dev = devinfo->dev; |
1169 | int ret; | ||
1237 | 1170 | ||
1238 | brcmf_dbg(USB, "Enter\n"); | 1171 | brcmf_dbg(USB, "Enter\n"); |
1239 | bus_pub = brcmf_usb_attach(devinfo, BRCMF_USB_NRXQ, BRCMF_USB_NTXQ); | 1172 | bus_pub = brcmf_usb_attach(devinfo, BRCMF_USB_NRXQ, BRCMF_USB_NTXQ); |
@@ -1254,22 +1187,18 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) | |||
1254 | bus->chip = bus_pub->devid; | 1187 | bus->chip = bus_pub->devid; |
1255 | bus->chiprev = bus_pub->chiprev; | 1188 | bus->chiprev = bus_pub->chiprev; |
1256 | bus->proto_type = BRCMF_PROTO_BCDC; | 1189 | bus->proto_type = BRCMF_PROTO_BCDC; |
1190 | bus->always_use_fws_queue = true; | ||
1257 | 1191 | ||
1258 | /* Attach to the common driver interface */ | 1192 | if (!brcmf_usb_dlneeded(devinfo)) { |
1259 | ret = brcmf_attach(dev); | 1193 | ret = brcmf_usb_bus_setup(devinfo); |
1260 | if (ret) { | 1194 | if (ret) |
1261 | brcmf_err("brcmf_attach failed\n"); | 1195 | goto fail; |
1262 | goto fail; | ||
1263 | } | ||
1264 | |||
1265 | ret = brcmf_bus_start(dev); | ||
1266 | if (ret) { | ||
1267 | brcmf_err("dongle is not responding\n"); | ||
1268 | brcmf_detach(dev); | ||
1269 | goto fail; | ||
1270 | } | 1196 | } |
1271 | 1197 | /* request firmware here */ | |
1198 | brcmf_fw_get_firmwares(dev, 0, brcmf_usb_get_fwname(devinfo), NULL, | ||
1199 | brcmf_usb_probe_phase2); | ||
1272 | return 0; | 1200 | return 0; |
1201 | |||
1273 | fail: | 1202 | fail: |
1274 | /* Release resources in reverse order */ | 1203 | /* Release resources in reverse order */ |
1275 | kfree(bus); | 1204 | kfree(bus); |
@@ -1357,9 +1286,6 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1357 | goto fail; | 1286 | goto fail; |
1358 | } | 1287 | } |
1359 | 1288 | ||
1360 | endpoint_num = endpoint->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; | ||
1361 | devinfo->intr_pipe = usb_rcvintpipe(usb, endpoint_num); | ||
1362 | |||
1363 | devinfo->rx_pipe = 0; | 1289 | devinfo->rx_pipe = 0; |
1364 | devinfo->rx_pipe2 = 0; | 1290 | devinfo->rx_pipe2 = 0; |
1365 | devinfo->tx_pipe = 0; | 1291 | devinfo->tx_pipe = 0; |
@@ -1391,16 +1317,9 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1391 | } | 1317 | } |
1392 | } | 1318 | } |
1393 | 1319 | ||
1394 | /* Allocate interrupt URB and data buffer */ | 1320 | if (usb->speed == USB_SPEED_SUPER) |
1395 | /* RNDIS says 8-byte intr, our old drivers used 4-byte */ | 1321 | brcmf_dbg(USB, "Broadcom super speed USB wireless device detected\n"); |
1396 | if (IFEPDESC(usb, CONTROL_IF, 0).wMaxPacketSize == cpu_to_le16(16)) | 1322 | else if (usb->speed == USB_SPEED_HIGH) |
1397 | devinfo->intr_size = 8; | ||
1398 | else | ||
1399 | devinfo->intr_size = 4; | ||
1400 | |||
1401 | devinfo->interval = IFEPDESC(usb, CONTROL_IF, 0).bInterval; | ||
1402 | |||
1403 | if (usb->speed == USB_SPEED_HIGH) | ||
1404 | brcmf_dbg(USB, "Broadcom high speed USB wireless device detected\n"); | 1323 | brcmf_dbg(USB, "Broadcom high speed USB wireless device detected\n"); |
1405 | else | 1324 | else |
1406 | brcmf_dbg(USB, "Broadcom full speed USB wireless device detected\n"); | 1325 | brcmf_dbg(USB, "Broadcom full speed USB wireless device detected\n"); |
@@ -1455,23 +1374,18 @@ static int brcmf_usb_resume(struct usb_interface *intf) | |||
1455 | struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev); | 1374 | struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev); |
1456 | 1375 | ||
1457 | brcmf_dbg(USB, "Enter\n"); | 1376 | brcmf_dbg(USB, "Enter\n"); |
1458 | if (!brcmf_attach(devinfo->dev)) | 1377 | return brcmf_usb_bus_setup(devinfo); |
1459 | return brcmf_bus_start(&usb->dev); | ||
1460 | |||
1461 | return 0; | ||
1462 | } | 1378 | } |
1463 | 1379 | ||
1464 | static int brcmf_usb_reset_resume(struct usb_interface *intf) | 1380 | static int brcmf_usb_reset_resume(struct usb_interface *intf) |
1465 | { | 1381 | { |
1466 | struct usb_device *usb = interface_to_usbdev(intf); | 1382 | struct usb_device *usb = interface_to_usbdev(intf); |
1467 | struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev); | 1383 | struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev); |
1468 | |||
1469 | brcmf_dbg(USB, "Enter\n"); | 1384 | brcmf_dbg(USB, "Enter\n"); |
1470 | 1385 | ||
1471 | if (!brcmf_usb_fw_download(devinfo)) | 1386 | return brcmf_fw_get_firmwares(&usb->dev, 0, |
1472 | return brcmf_usb_resume(intf); | 1387 | brcmf_usb_get_fwname(devinfo), NULL, |
1473 | 1388 | brcmf_usb_probe_phase2); | |
1474 | return -EIO; | ||
1475 | } | 1389 | } |
1476 | 1390 | ||
1477 | #define BRCMF_USB_VENDOR_ID_BROADCOM 0x0a5c | 1391 | #define BRCMF_USB_VENDOR_ID_BROADCOM 0x0a5c |
@@ -1506,16 +1420,6 @@ static struct usb_driver brcmf_usbdrvr = { | |||
1506 | .disable_hub_initiated_lpm = 1, | 1420 | .disable_hub_initiated_lpm = 1, |
1507 | }; | 1421 | }; |
1508 | 1422 | ||
1509 | static void brcmf_release_fw(struct list_head *q) | ||
1510 | { | ||
1511 | struct brcmf_usb_image *fw_image, *next; | ||
1512 | |||
1513 | list_for_each_entry_safe(fw_image, next, q, list) { | ||
1514 | vfree(fw_image->image); | ||
1515 | list_del_init(&fw_image->list); | ||
1516 | } | ||
1517 | } | ||
1518 | |||
1519 | static int brcmf_usb_reset_device(struct device *dev, void *notused) | 1423 | static int brcmf_usb_reset_device(struct device *dev, void *notused) |
1520 | { | 1424 | { |
1521 | /* device past is the usb interface so we | 1425 | /* device past is the usb interface so we |
@@ -1534,12 +1438,10 @@ void brcmf_usb_exit(void) | |||
1534 | ret = driver_for_each_device(drv, NULL, NULL, | 1438 | ret = driver_for_each_device(drv, NULL, NULL, |
1535 | brcmf_usb_reset_device); | 1439 | brcmf_usb_reset_device); |
1536 | usb_deregister(&brcmf_usbdrvr); | 1440 | usb_deregister(&brcmf_usbdrvr); |
1537 | brcmf_release_fw(&fw_image_list); | ||
1538 | } | 1441 | } |
1539 | 1442 | ||
1540 | void brcmf_usb_register(void) | 1443 | void brcmf_usb_register(void) |
1541 | { | 1444 | { |
1542 | brcmf_dbg(USB, "Enter\n"); | 1445 | brcmf_dbg(USB, "Enter\n"); |
1543 | INIT_LIST_HEAD(&fw_image_list); | ||
1544 | usb_register(&brcmf_usbdrvr); | 1446 | usb_register(&brcmf_usbdrvr); |
1545 | } | 1447 | } |