Re: Trouble loading firmware to USB device
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 26 Apr 2022 17:24:24 UTC
I mistakenly emailed Hans directly rather than copying the email list. Sorry, switched email clients :/ Keeping the full exchange below for one email round. On Tuesday, April 26, 2022 3:01:44 AM EDT you wrote: > On 4/26/22 07:42, Farhan Khan wrote: > > On Monday, April 25, 2022 4:21:04 AM EDT you wrote: > >> Hi, > >> > >>> status 0xeb023 > >>> <OPEN|TRANSFERRING|STARTED|SHORT_XFER_OK|BDMA_ENABLE|BDMA_SETUP|CURR_D > >>> MA > >>> _SET|CAN_CANCEL_IMMED|DOING_CALLBACK|0>> > >>> > >>> 12:25:07.785438 usbus3.3 > >>> SUBM-INTR-EP=00000083,SPD=HIGH,NFR=1,SLEN=0,IVAL=1 > >>> > >>> frame[0] READ 1024 bytes > >>> flags 0xa <SHORT_XFER_OK|PIPE_BOF|0> > >> > >> You are asking for 1024 bytes. Try asking for only 64 bytes instead, > >> same as one wMaxPacket, before submitting the job. > >> > >> --HPS > > > > I believe my bufsize was already set to 64 (0x40). However, I do not see > > where I am reading or writing to the device except when loading/unloading > > the firmware. I just gave my code a read-through and do not see a > > reference to 1024. > > > > Regarding the 64-byte buffer, I went through OpenBSD's code base and when > > they open pipes (I believe the same as usbd_transfer_setup(9)), they > > allocate a 64- byte buffer and associate it with the Rx Interrupt pipe, > > as follows: > > > > ---START OPENBSD CODE--- > > > > isize = UGETW(ed->wMaxPacketSize); > > if (isize == 0) { > > > > printf("%s: invalid Rx intr pipe descriptor\n", > > > > usc->usb_dev.dv_xname); > > > > goto fail; > > > > } > > usc->ibuf = malloc(isize, M_USBDEV, M_NOWAIT); > > if (usc->ibuf == NULL) { > > > > printf("%s: could not allocate Rx intr buffer\n", > > > > usc->usb_dev.dv_xname); > > > > goto fail; > > > > } > > usc->ibuflen = isize; > > error = usbd_open_pipe_intr(usc->sc_iface, AR_PIPE_RX_INTR, > > > > USBD_SHORT_XFER_OK, &usc->rx_intr_pipe, usc, usc->ibuf, isize, > > athn_usb_intr, USBD_DEFAULT_INTERVAL); > > > > ---END OPENBSD CODE--- > > > > It appears to me like it is reading the size of the Max Packet size, > > allocating that many bytes and setting that as the equivalent of bufsize. > > Hi, > > > So my question is, where am I reading 1024 bytes, such that I need to > > change it to 64? > > The "usbdump" says that you have setup a receive buffer of 1024 bytes. > > Try adding some prints here: > > printf("====USB_ST_SETUP athn_usb_intr\n"); > > usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); > > Try to print usbd_xfer_max_len(xfer) . printf("---------The length is %d\n", usbd_xfer_max_len(xfer)); This is now giving me a size of 64. My usb_config bufsize is set to 64 (0x40). > > Also try to "make clean cleandepend" your module. I added this to my build script, which previously just ran `make clean`. > > And verify using usbdump again. This looks like what we want, I believe. ----- Endpoint 2 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0083 <IN> bmAttributes = 0x0003 <INTERRUPT> wMaxPacketSize = 0x0040 bInterval = 0x0001 bRefresh = 0x0000 bSynchAddress = 0x0000 Endpoint 3 bLength = 0x0007 bDescriptorType = 0x0005 bEndpointAddress = 0x0004 <OUT> bmAttributes = 0x0003 <INTERRUPT> wMaxPacketSize = 0x0040 bInterval = 0x0001 bRefresh = 0x0000 bSynchAddress = 0x0000 ----- > > Where is "" defined. I cannot find it! I was following how rtwn did it because this driver has a potential PCI component, not a single USB stand alone driver. That value is defined in /usr/ src/sys/dev/athn/athnvar.h ``` enum { ATHN_TX_DATA, ATHN_RX_DATA, ATHN_RX_INTR, ATHN_TX_INTR, ATHN_N_TRANSFERS, // A semi-copy from RTWN_N_TRANSFER }; ``` Github link: https://github.com/khanzf/freebsd/blob/ar9271/sys/dev/athn/ athnvar.h#L25 > > --HPS - Farhan