···5757#include <linux/usb/wusb.h>5858#include <linux/usb/wusb-wa.h>5959#include <linux/uwb.h>6060+6061#include "uwb-internal.h"6161-#define D_LOCAL 16262-#include <linux/uwb/debug.h>63626463/* The device uses commands and events from the WHCI specification, although6564 * reporting itself as WUSB compliant. */···629630630631 switch (result = urb->status) {631632 case 0:632632- d_printf(3, dev, "NEEP: receive stat %d, %zu bytes\n",633633- urb->status, (size_t)urb->actual_length);634633 uwb_rc_neh_grok(hwarc->uwb_rc, urb->transfer_buffer,635634 urb->actual_length);636635 break;637636 case -ECONNRESET: /* Not an error, but a controlled situation; */638637 case -ENOENT: /* (we killed the URB)...so, no broadcast */639639- d_printf(2, dev, "NEEP: URB reset/noent %d\n", urb->status);640638 goto out;641639 case -ESHUTDOWN: /* going away! */642642- d_printf(2, dev, "NEEP: URB down %d\n", urb->status);643640 goto out;644641 default: /* On general errors, retry unless it gets ugly */645642 if (edc_inc(&hwarc->neep_edc, EDC_MAX_ERRORS,···644649 dev_err(dev, "NEEP: URB error %d\n", urb->status);645650 }646651 result = usb_submit_urb(urb, GFP_ATOMIC);647647- d_printf(3, dev, "NEEP: submit %d\n", result);648652 if (result < 0) {649653 dev_err(dev, "NEEP: Can't resubmit URB (%d) resetting device\n",650654 result);···752758 itr_size = le16_to_cpu(usb_dev->actconfig->desc.wTotalLength);753759 while (itr_size >= sizeof(*hdr)) {754760 hdr = (struct usb_descriptor_header *) itr;755755- d_printf(3, dev, "Extra device descriptor: "756756- "type %02x/%u bytes @ %zu (%zu left)\n",757757- hdr->bDescriptorType, hdr->bLength,758758- (itr - usb_dev->rawdescriptors[actconfig_idx]),759759- itr_size);761761+ dev_dbg(dev, "Extra device descriptor: "762762+ "type %02x/%u bytes @ %zu (%zu left)\n",763763+ hdr->bDescriptorType, hdr->bLength,764764+ (itr - usb_dev->rawdescriptors[actconfig_idx]),765765+ itr_size);760766 if (hdr->bDescriptorType == USB_DT_CS_RADIO_CONTROL)761767 goto found;762768 itr += hdr->bLength;···788794 goto error;789795 }790796 rc->version = version;791791- d_printf(3, dev, "Device supports WUSB protocol version 0x%04x \n",792792- rc->version);797797+ dev_dbg(dev, "Device supports WUSB protocol version 0x%04x \n", rc->version);793798 result = 0;794799error:795800 return result;···869876 uwb_rc_rm(uwb_rc);870877 usb_put_intf(hwarc->usb_iface);871878 usb_put_dev(hwarc->usb_dev);872872- d_printf(1, &hwarc->usb_iface->dev, "freed hwarc %p\n", hwarc);873879 kfree(hwarc);874880 uwb_rc_put(uwb_rc); /* when creating the device, refcount = 1 */875881}···916924917925static int __init hwarc_driver_init(void)918926{919919- int result;920920- result = usb_register(&hwarc_driver);921921- if (result < 0)922922- printk(KERN_ERR "HWA-RC: Cannot register USB driver: %d\n",923923- result);924924- return result;925925-927927+ return usb_register(&hwarc_driver);926928}927929module_init(hwarc_driver_init);928930
+2-8
drivers/uwb/i1480/dfu/dfu.c
···3434#include <linux/uwb.h>3535#include <linux/random.h>36363737-#define D_LOCAL 03838-#include <linux/uwb/debug.h>3939-4040-/**3737+/*4138 * i1480_rceb_check - Check RCEB for expected field values4239 * @i1480: pointer to device for which RCEB is being checked4340 * @rceb: RCEB being checked···8083EXPORT_SYMBOL_GPL(i1480_rceb_check);818482858383-/**8686+/*8487 * Execute a Radio Control Command8588 *8689 * Command data has to be in i1480->cmd_buf.···98101 u8 expected_type = reply->bEventType;99102 u8 context;100103101101- d_fnstart(3, i1480->dev, "(%p, %s, %zu)\n", i1480, cmd_name, cmd_size);102104 init_completion(&i1480->evt_complete);103105 i1480->evt_result = -EINPROGRESS;104106 do {···146150 result = i1480_rceb_check(i1480, i1480->evt_buf, cmd_name, context,147151 expected_type, expected_event);148152error:149149- d_fnend(3, i1480->dev, "(%p, %s, %zu) = %zd\n",150150- i1480, cmd_name, cmd_size, result);151153 return result;152154}153155EXPORT_SYMBOL_GPL(i1480_cmd);
-18
drivers/uwb/i1480/dfu/mac.c
···3131#include <linux/uwb.h>3232#include "i1480-dfu.h"33333434-#define D_LOCAL 03535-#include <linux/uwb/debug.h>3636-3734/*3835 * Descriptor for a continuous segment of MAC fw data3936 */···181184 }182185 if (memcmp(i1480->cmd_buf, bin + src_itr, result)) {183186 u8 *buf = i1480->cmd_buf;184184- d_printf(2, i1480->dev,185185- "original data @ %p + %u, %zu bytes\n",186186- bin, src_itr, result);187187- d_dump(4, i1480->dev, bin + src_itr, result);188187 for (cnt = 0; cnt < result; cnt++)189188 if (bin[src_itr + cnt] != buf[cnt]) {190189 dev_err(i1480->dev, "byte failed at "···217224 struct fw_hdr *hdr_itr;218225 int verif_retry_count;219226220220- d_fnstart(3, dev, "(%p, %p)\n", i1480, hdr);221227 /* Now, header by header, push them to the hw */222228 for (hdr_itr = hdr; hdr_itr != NULL; hdr_itr = hdr_itr->next) {223229 verif_retry_count = 0;···256264 break;257265 }258266 }259259- d_fnend(3, dev, "(%zd)\n", result);260267 return result;261268}262269···328337 const struct firmware *fw;329338 struct fw_hdr *fw_hdrs;330339331331- d_fnstart(3, i1480->dev, "(%p, %s, %s)\n", i1480, fw_name, fw_tag);332340 result = request_firmware(&fw, fw_name, i1480->dev);333341 if (result < 0) /* Up to caller to complain on -ENOENT */334342 goto out;335335- d_printf(3, i1480->dev, "%s fw '%s': uploading\n", fw_tag, fw_name);336343 result = fw_hdrs_load(i1480, &fw_hdrs, fw->data, fw->size);337344 if (result < 0) {338345 dev_err(i1480->dev, "%s fw '%s': failed to parse firmware "···352363out_release:353364 release_firmware(fw);354365out:355355- d_fnend(3, i1480->dev, "(%p, %s, %s) = %d\n", i1480, fw_name, fw_tag,356356- result);357366 return result;358367}359368···420433 int result;421434 u32 *val = (u32 *) i1480->cmd_buf;422435423423- d_fnstart(3, i1480->dev, "(i1480 %p)\n", i1480);424436 for (cnt = 0; cnt < 10; cnt++) {425437 msleep(100);426438 result = i1480->read(i1480, 0x80080000, 4);···433447 dev_err(i1480->dev, "Timed out waiting for fw to start\n");434448 result = -ETIMEDOUT;435449out:436436- d_fnend(3, i1480->dev, "(i1480 %p) = %d\n", i1480, result);437450 return result;438451439452}···452467 int result = 0, deprecated_name = 0;453468 struct i1480_rceb *rcebe = (void *) i1480->evt_buf;454469455455- d_fnstart(3, i1480->dev, "(%p)\n", i1480);456470 result = __mac_fw_upload(i1480, i1480->mac_fw_name, "MAC");457471 if (result == -ENOENT) {458472 result = __mac_fw_upload(i1480, i1480->mac_fw_name_deprecate,···485501 dev_err(i1480->dev, "MAC fw '%s': initialization event returns "486502 "wrong size (%zu bytes vs %zu needed)\n",487503 i1480->mac_fw_name, i1480->evt_result, sizeof(*rcebe));488488- dump_bytes(i1480->dev, rcebe, min(i1480->evt_result, (ssize_t)32));489504 goto error_size;490505 }491506 result = -EIO;···505522error_init_timeout:506523error_size:507524error_setup:508508- d_fnend(3, i1480->dev, "(i1480 %p) = %d\n", i1480, result);509525 return result;510526}
···6868#include <linux/etherdevice.h>6969#include "i1480u-wlp.h"70707171-#define D_LOCAL 07272-#include <linux/uwb/debug.h>7373-7474-7575-/**7171+/*7672 * Setup the RX context7773 *7874 * Each URB is provided with a transfer_buffer that is the data field···125129}126130127131128128-/** Release resources associated to the rx context */132132+/* Release resources associated to the rx context */129133void i1480u_rx_release(struct i1480u *i1480u)130134{131135 int cnt;···151155 }152156}153157154154-/** Fix an out-of-sequence packet */158158+/* Fix an out-of-sequence packet */155159#define i1480u_fix(i1480u, msg...) \156160do { \157161 if (printk_ratelimit()) \···162166} while (0)163167164168165165-/** Drop an out-of-sequence packet */169169+/* Drop an out-of-sequence packet */166170#define i1480u_drop(i1480u, msg...) \167171do { \168172 if (printk_ratelimit()) \···173177174178175179176176-/** Finalizes setting up the SKB and delivers it180180+/* Finalizes setting up the SKB and delivers it177181 *178182 * We first pass the incoming frame to WLP substack for verification. It179183 * may also be a WLP association frame in which case WLP will take over the···188192 struct net_device *net_dev = i1480u->net_dev;189193 struct device *dev = &i1480u->usb_iface->dev;190194191191- d_printf(6, dev, "RX delivered pre skb(%p), %u bytes\n",192192- i1480u->rx_skb, i1480u->rx_skb->len);193193- d_dump(7, dev, i1480u->rx_skb->data, i1480u->rx_skb->len);194195 should_parse = wlp_receive_frame(dev, &i1480u->wlp, i1480u->rx_skb,195196 &i1480u->rx_srcaddr);196197 if (!should_parse)197198 goto out;198199 i1480u->rx_skb->protocol = eth_type_trans(i1480u->rx_skb, net_dev);199199- d_printf(5, dev, "RX delivered skb(%p), %u bytes\n",200200- i1480u->rx_skb, i1480u->rx_skb->len);201201- d_dump(7, dev, i1480u->rx_skb->data,202202- i1480u->rx_skb->len > 72 ? 72 : i1480u->rx_skb->len);203200 i1480u->stats.rx_packets++;204201 i1480u->stats.rx_bytes += i1480u->rx_untd_pkt_size;205202 net_dev->last_rx = jiffies;···205216}206217207218208208-/**219219+/*209220 * Process a buffer of data received from the USB RX endpoint210221 *211222 * First fragment arrives with next or last fragment. All other fragments···393404}394405395406396396-/**407407+/*397408 * Called when an RX URB has finished receiving or has found some kind398409 * of error condition.399410 *
+8-58
drivers/uwb/i1480/i1480u-wlp/tx.c
···5555 */56565757#include "i1480u-wlp.h"5858-#define D_LOCAL 55959-#include <linux/uwb/debug.h>60586159enum {6260 /* This is only for Next and Last TX packets */···6264 - sizeof(struct untd_hdr_rst),6365};64666565-/** Free resources allocated to a i1480u tx context. */6767+/* Free resources allocated to a i1480u tx context. */6668static6769void i1480u_tx_free(struct i1480u_tx *wtx)6870{···9799}9810099101100100-/**102102+/*101103 * Callback for a completed tx USB URB.102104 *103105 * TODO:···147149 <= i1480u->tx_inflight.threshold148150 && netif_queue_stopped(net_dev)149151 && i1480u->tx_inflight.threshold != 0) {150150- if (d_test(2) && printk_ratelimit())151151- d_printf(2, dev, "Restart queue. \n");152152 netif_start_queue(net_dev);153153 atomic_inc(&i1480u->tx_inflight.restart_count);154154 }···154158}155159156160157157-/**161161+/*158162 * Given a buffer that doesn't fit in a single fragment, create an159163 * scatter/gather structure for delivery to the USB pipe.160164 *···249253 /* Now do each remaining fragment */250254 result = -EINVAL;251255 while (pl_size_left > 0) {252252- d_printf(5, NULL, "ITR HDR: pl_size_left %zu buf_itr %zu\n",253253- pl_size_left, buf_itr - wtx->buf);254256 if (buf_itr + sizeof(*untd_hdr_rst) - wtx->buf255257 > wtx->buf_size) {256258 printk(KERN_ERR "BUG: no space for header\n");257259 goto error_bug;258260 }259259- d_printf(5, NULL, "ITR HDR 2: pl_size_left %zu buf_itr %zu\n",260260- pl_size_left, buf_itr - wtx->buf);261261 untd_hdr_rst = buf_itr;262262 buf_itr += sizeof(*untd_hdr_rst);263263 if (pl_size_left > i1480u_MAX_PL_SIZE) {···263271 frg_pl_size = pl_size_left;264272 untd_hdr_set_type(&untd_hdr_rst->hdr, i1480u_PKT_FRAG_LST);265273 }266266- d_printf(5, NULL,267267- "ITR PL: pl_size_left %zu buf_itr %zu frg_pl_size %zu\n",268268- pl_size_left, buf_itr - wtx->buf, frg_pl_size);269274 untd_hdr_set_rx_tx(&untd_hdr_rst->hdr, 0);270275 untd_hdr_rst->hdr.len = cpu_to_le16(frg_pl_size);271276 untd_hdr_rst->padding = 0;···275286 buf_itr += frg_pl_size;276287 pl_itr += frg_pl_size;277288 pl_size_left -= frg_pl_size;278278- d_printf(5, NULL,279279- "ITR PL 2: pl_size_left %zu buf_itr %zu frg_pl_size %zu\n",280280- pl_size_left, buf_itr - wtx->buf, frg_pl_size);281289 }282290 dev_kfree_skb_irq(skb);283291 return 0;···294308}295309296310297297-/**311311+/*298312 * Given a buffer that fits in a single fragment, fill out a @wtx299313 * struct for transmitting it down the USB pipe.300314 *···332346}333347334348335335-/**349349+/*336350 * Given a skb to transmit, massage it to become palatable for the TX pipe337351 *338352 * This will break the buffer in chunks smaller than···411425 return NULL;412426}413427414414-/**428428+/*415429 * Actual fragmentation and transmission of frame416430 *417431 * @wlp: WLP substack data structure···433447 struct i1480u_tx *wtx;434448 struct wlp_tx_hdr *wlp_tx_hdr;435449 static unsigned char dev_bcast[2] = { 0xff, 0xff };436436-#if 0437437- int lockup = 50;438438-#endif439450440440- d_fnstart(6, dev, "(skb %p (%u), net_dev %p)\n", skb, skb->len,441441- net_dev);442451 BUG_ON(i1480u->wlp.rc == NULL);443452 if ((net_dev->flags & IFF_UP) == 0)444453 goto out;445454 result = -EBUSY;446455 if (atomic_read(&i1480u->tx_inflight.count) >= i1480u->tx_inflight.max) {447447- if (d_test(2) && printk_ratelimit())448448- d_printf(2, dev, "Max frames in flight "449449- "stopping queue.\n");450456 netif_stop_queue(net_dev);451457 goto error_max_inflight;452458 }···467489 wlp_tx_hdr_set_delivery_id_type(wlp_tx_hdr, i1480u->options.pca_base_priority);468490 }469491470470-#if 0471471- dev_info(dev, "TX delivering skb -> USB, %zu bytes\n", skb->len);472472- dump_bytes(dev, skb->data, skb->len > 72 ? 72 : skb->len);473473-#endif474474-#if 0475475- /* simulates a device lockup after every lockup# packets */476476- if (lockup && ((i1480u->stats.tx_packets + 1) % lockup) == 0) {477477- /* Simulate a dropped transmit interrupt */478478- net_dev->trans_start = jiffies;479479- netif_stop_queue(net_dev);480480- dev_err(dev, "Simulate lockup at %ld\n", jiffies);481481- return result;482482- }483483-#endif484484-485492 result = usb_submit_urb(wtx->urb, GFP_ATOMIC); /* Go baby */486493 if (result < 0) {487494 dev_err(dev, "TX: cannot submit URB: %d\n", result);···476513 }477514 atomic_inc(&i1480u->tx_inflight.count);478515 net_dev->trans_start = jiffies;479479- d_fnend(6, dev, "(skb %p (%u), net_dev %p) = %d\n", skb, skb->len,480480- net_dev, result);481516 return result;482517483518error_tx_urb_submit:···483522error_wtx_alloc:484523error_max_inflight:485524out:486486- d_fnend(6, dev, "(skb %p (%u), net_dev %p) = %d\n", skb, skb->len,487487- net_dev, result);488525 return result;489526}490527491528492492-/**529529+/*493530 * Transmit an skb Called when an skbuf has to be transmitted494531 *495532 * The skb is first passed to WLP substack to ensure this is a valid···510551 struct device *dev = &i1480u->usb_iface->dev;511552 struct uwb_dev_addr dst;512553513513- d_fnstart(6, dev, "(skb %p (%u), net_dev %p)\n", skb, skb->len,514514- net_dev);515515- BUG_ON(i1480u->wlp.rc == NULL);516554 if ((net_dev->flags & IFF_UP) == 0)517555 goto error;518556 result = wlp_prepare_tx_frame(dev, &i1480u->wlp, skb, &dst);···518562 "Dropping packet.\n", result);519563 goto error;520564 } else if (result == 1) {521521- d_printf(6, dev, "WLP will transmit frame. \n");522565 /* trans_start time will be set when WLP actually transmits523566 * the frame */524567 goto out;525568 }526526- d_printf(6, dev, "Transmitting frame. \n");527569 result = i1480u_xmit_frame(&i1480u->wlp, skb, &dst);528570 if (result < 0) {529571 dev_err(dev, "Frame TX failed (%d).\n", result);530572 goto error;531573 }532532- d_fnend(6, dev, "(skb %p (%u), net_dev %p) = %d\n", skb, skb->len,533533- net_dev, result);534574 return NETDEV_TX_OK;535575error:536576 dev_kfree_skb_any(skb);537577 i1480u->stats.tx_dropped++;538578out:539539- d_fnend(6, dev, "(skb %p (%u), net_dev %p) = %d\n", skb, skb->len,540540- net_dev, result);541579 return NETDEV_TX_OK;542580}543581544582545545-/**583583+/*546584 * Called when a pkt transmission doesn't complete in a reasonable period547585 * Device reset may sleep - do it outside of interrupt context (delayed)548586 */