Merge branch 'master' of git://git.denx.de/u-boot-usb
This commit is contained in:
commit
9de9932693
@ -204,6 +204,22 @@ int usb_stor_info(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int usb_get_max_lun(struct us_data *us)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
unsigned char result;
|
||||||
|
len = usb_control_msg(us->pusb_dev,
|
||||||
|
usb_rcvctrlpipe(us->pusb_dev, 0),
|
||||||
|
US_BBB_GET_MAX_LUN,
|
||||||
|
USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
|
||||||
|
0, us->ifnum,
|
||||||
|
&result, sizeof(result),
|
||||||
|
USB_CNTL_TIMEOUT * 5);
|
||||||
|
USB_STOR_PRINTF("Get Max LUN -> len = %i, result = %i\n",
|
||||||
|
len, (int) result);
|
||||||
|
return (len > 0) ? result : 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* scan the usb and reports device info
|
* scan the usb and reports device info
|
||||||
* to the user if mode = 1
|
* to the user if mode = 1
|
||||||
@ -241,12 +257,21 @@ int usb_stor_scan(int mode)
|
|||||||
break; /* no more devices avaiable */
|
break; /* no more devices avaiable */
|
||||||
|
|
||||||
if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) {
|
if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) {
|
||||||
/* ok, it is a storage devices
|
/* OK, it's a storage device. Iterate over its LUNs
|
||||||
* get info and fill it in
|
* and populate `usb_dev_desc'.
|
||||||
*/
|
*/
|
||||||
if (usb_stor_get_info(dev, &usb_stor[usb_max_devs],
|
int lun, max_lun, start = usb_max_devs;
|
||||||
&usb_dev_desc[usb_max_devs]) == 1)
|
|
||||||
|
max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
|
||||||
|
for (lun = 0;
|
||||||
|
lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV;
|
||||||
|
lun++) {
|
||||||
|
usb_dev_desc[usb_max_devs].lun = lun;
|
||||||
|
if (usb_stor_get_info(dev, &usb_stor[start],
|
||||||
|
&usb_dev_desc[usb_max_devs]) == 1) {
|
||||||
usb_max_devs++;
|
usb_max_devs++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* if storage device */
|
/* if storage device */
|
||||||
if (usb_max_devs == USB_MAX_STOR_DEV) {
|
if (usb_max_devs == USB_MAX_STOR_DEV) {
|
||||||
@ -882,6 +907,7 @@ static int usb_inquiry(ccb *srb, struct us_data *ss)
|
|||||||
do {
|
do {
|
||||||
memset(&srb->cmd[0], 0, 12);
|
memset(&srb->cmd[0], 0, 12);
|
||||||
srb->cmd[0] = SCSI_INQUIRY;
|
srb->cmd[0] = SCSI_INQUIRY;
|
||||||
|
srb->cmd[1] = srb->lun << 5;
|
||||||
srb->cmd[4] = 36;
|
srb->cmd[4] = 36;
|
||||||
srb->datalen = 36;
|
srb->datalen = 36;
|
||||||
srb->cmdlen = 12;
|
srb->cmdlen = 12;
|
||||||
@ -905,6 +931,7 @@ static int usb_request_sense(ccb *srb, struct us_data *ss)
|
|||||||
ptr = (char *)srb->pdata;
|
ptr = (char *)srb->pdata;
|
||||||
memset(&srb->cmd[0], 0, 12);
|
memset(&srb->cmd[0], 0, 12);
|
||||||
srb->cmd[0] = SCSI_REQ_SENSE;
|
srb->cmd[0] = SCSI_REQ_SENSE;
|
||||||
|
srb->cmd[1] = srb->lun << 5;
|
||||||
srb->cmd[4] = 18;
|
srb->cmd[4] = 18;
|
||||||
srb->datalen = 18;
|
srb->datalen = 18;
|
||||||
srb->pdata = &srb->sense_buf[0];
|
srb->pdata = &srb->sense_buf[0];
|
||||||
@ -924,6 +951,7 @@ static int usb_test_unit_ready(ccb *srb, struct us_data *ss)
|
|||||||
do {
|
do {
|
||||||
memset(&srb->cmd[0], 0, 12);
|
memset(&srb->cmd[0], 0, 12);
|
||||||
srb->cmd[0] = SCSI_TST_U_RDY;
|
srb->cmd[0] = SCSI_TST_U_RDY;
|
||||||
|
srb->cmd[1] = srb->lun << 5;
|
||||||
srb->datalen = 0;
|
srb->datalen = 0;
|
||||||
srb->cmdlen = 12;
|
srb->cmdlen = 12;
|
||||||
if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD)
|
if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD)
|
||||||
@ -943,6 +971,7 @@ static int usb_read_capacity(ccb *srb, struct us_data *ss)
|
|||||||
do {
|
do {
|
||||||
memset(&srb->cmd[0], 0, 12);
|
memset(&srb->cmd[0], 0, 12);
|
||||||
srb->cmd[0] = SCSI_RD_CAPAC;
|
srb->cmd[0] = SCSI_RD_CAPAC;
|
||||||
|
srb->cmd[1] = srb->lun << 5;
|
||||||
srb->datalen = 8;
|
srb->datalen = 8;
|
||||||
srb->cmdlen = 12;
|
srb->cmdlen = 12;
|
||||||
if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD)
|
if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD)
|
||||||
@ -957,6 +986,7 @@ static int usb_read_10(ccb *srb, struct us_data *ss, unsigned long start,
|
|||||||
{
|
{
|
||||||
memset(&srb->cmd[0], 0, 12);
|
memset(&srb->cmd[0], 0, 12);
|
||||||
srb->cmd[0] = SCSI_READ10;
|
srb->cmd[0] = SCSI_READ10;
|
||||||
|
srb->cmd[1] = srb->lun << 5;
|
||||||
srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff;
|
srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff;
|
||||||
srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff;
|
srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff;
|
||||||
srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff;
|
srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff;
|
||||||
@ -973,6 +1003,7 @@ static int usb_write_10(ccb *srb, struct us_data *ss, unsigned long start,
|
|||||||
{
|
{
|
||||||
memset(&srb->cmd[0], 0, 12);
|
memset(&srb->cmd[0], 0, 12);
|
||||||
srb->cmd[0] = SCSI_WRITE10;
|
srb->cmd[0] = SCSI_WRITE10;
|
||||||
|
srb->cmd[1] = srb->lun << 5;
|
||||||
srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff;
|
srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff;
|
||||||
srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff;
|
srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff;
|
||||||
srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff;
|
srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff;
|
||||||
|
@ -1276,9 +1276,6 @@ static void rx_complete(struct usb_ep *ep, struct usb_request *req)
|
|||||||
debug("%s: status %d\n", __func__, req->status);
|
debug("%s: status %d\n", __func__, req->status);
|
||||||
|
|
||||||
packet_received = 1;
|
packet_received = 1;
|
||||||
|
|
||||||
if (req)
|
|
||||||
dev->rx_req = req;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int alloc_requests(struct eth_dev *dev, unsigned n, gfp_t gfp_flags)
|
static int alloc_requests(struct eth_dev *dev, unsigned n, gfp_t gfp_flags)
|
||||||
@ -1287,16 +1284,18 @@ static int alloc_requests(struct eth_dev *dev, unsigned n, gfp_t gfp_flags)
|
|||||||
dev->tx_req = usb_ep_alloc_request(dev->in_ep, 0);
|
dev->tx_req = usb_ep_alloc_request(dev->in_ep, 0);
|
||||||
|
|
||||||
if (!dev->tx_req)
|
if (!dev->tx_req)
|
||||||
goto fail;
|
goto fail1;
|
||||||
|
|
||||||
dev->rx_req = usb_ep_alloc_request(dev->out_ep, 0);
|
dev->rx_req = usb_ep_alloc_request(dev->out_ep, 0);
|
||||||
|
|
||||||
if (!dev->rx_req)
|
if (!dev->rx_req)
|
||||||
goto fail;
|
goto fail2;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
fail2:
|
||||||
|
usb_ep_free_request(dev->in_ep, dev->tx_req);
|
||||||
|
fail1:
|
||||||
error("can't alloc requests");
|
error("can't alloc requests");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1791,8 +1790,6 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dev->network_started = 0;
|
dev->network_started = 0;
|
||||||
dev->tx_req = NULL;
|
|
||||||
dev->rx_req = NULL;
|
|
||||||
|
|
||||||
packet_received = 0;
|
packet_received = 0;
|
||||||
packet_sent = 0;
|
packet_sent = 0;
|
||||||
@ -1813,6 +1810,7 @@ static int usb_eth_init(struct eth_device *netdev, bd_t *bd)
|
|||||||
usb_gadget_handle_interrupts();
|
usb_gadget_handle_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
packet_received = 0;
|
||||||
rx_submit(dev, dev->rx_req, 0);
|
rx_submit(dev, dev->rx_req, 0);
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
fail:
|
||||||
@ -1823,15 +1821,13 @@ static int usb_eth_send(struct eth_device *netdev,
|
|||||||
volatile void *packet, int length)
|
volatile void *packet, int length)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
struct usb_request *req = NULL;
|
|
||||||
struct eth_dev *dev = &l_ethdev;
|
struct eth_dev *dev = &l_ethdev;
|
||||||
|
struct usb_request *req = dev->tx_req;
|
||||||
unsigned long ts;
|
unsigned long ts;
|
||||||
unsigned long timeout = USB_CONNECT_TIMEOUT;
|
unsigned long timeout = USB_CONNECT_TIMEOUT;
|
||||||
|
|
||||||
debug("%s:...\n", __func__);
|
debug("%s:...\n", __func__);
|
||||||
|
|
||||||
req = dev->tx_req;
|
|
||||||
|
|
||||||
req->buf = (void *)packet;
|
req->buf = (void *)packet;
|
||||||
req->context = NULL;
|
req->context = NULL;
|
||||||
req->complete = tx_complete;
|
req->complete = tx_complete;
|
||||||
@ -1883,8 +1879,7 @@ static int usb_eth_recv(struct eth_device *netdev)
|
|||||||
NetReceive(NetRxPackets[0], dev->rx_req->length);
|
NetReceive(NetRxPackets[0], dev->rx_req->length);
|
||||||
packet_received = 0;
|
packet_received = 0;
|
||||||
|
|
||||||
if (dev->rx_req)
|
rx_submit(dev, dev->rx_req, 0);
|
||||||
rx_submit(dev, dev->rx_req, 0);
|
|
||||||
} else
|
} else
|
||||||
error("dev->rx_req invalid");
|
error("dev->rx_req invalid");
|
||||||
}
|
}
|
||||||
|
@ -1529,7 +1529,7 @@ int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
|
|||||||
if (usb_pipebulk(pipe))
|
if (usb_pipebulk(pipe))
|
||||||
timeout = BULK_TO;
|
timeout = BULK_TO;
|
||||||
else
|
else
|
||||||
timeout = 100;
|
timeout = 1000;
|
||||||
|
|
||||||
/* wait for it to complete */
|
/* wait for it to complete */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
@ -144,19 +144,28 @@ static void write_toggle(struct usb_device *dev, u8 ep, u8 dir_out)
|
|||||||
u16 csr;
|
u16 csr;
|
||||||
|
|
||||||
if (dir_out) {
|
if (dir_out) {
|
||||||
if (!toggle)
|
csr = readw(&musbr->txcsr);
|
||||||
writew(MUSB_TXCSR_CLRDATATOG, &musbr->txcsr);
|
if (!toggle) {
|
||||||
else {
|
if (csr & MUSB_TXCSR_MODE)
|
||||||
csr = readw(&musbr->txcsr);
|
csr = MUSB_TXCSR_CLRDATATOG;
|
||||||
|
else
|
||||||
|
csr = 0;
|
||||||
|
writew(csr, &musbr->txcsr);
|
||||||
|
} else {
|
||||||
csr |= MUSB_TXCSR_H_WR_DATATOGGLE;
|
csr |= MUSB_TXCSR_H_WR_DATATOGGLE;
|
||||||
writew(csr, &musbr->txcsr);
|
writew(csr, &musbr->txcsr);
|
||||||
csr |= (toggle << MUSB_TXCSR_H_DATATOGGLE_SHIFT);
|
csr |= (toggle << MUSB_TXCSR_H_DATATOGGLE_SHIFT);
|
||||||
writew(csr, &musbr->txcsr);
|
writew(csr, &musbr->txcsr);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!toggle)
|
if (!toggle) {
|
||||||
writew(MUSB_RXCSR_CLRDATATOG, &musbr->rxcsr);
|
csr = readw(&musbr->txcsr);
|
||||||
else {
|
if (csr & MUSB_TXCSR_MODE)
|
||||||
|
csr = MUSB_RXCSR_CLRDATATOG;
|
||||||
|
else
|
||||||
|
csr = 0;
|
||||||
|
writew(csr, &musbr->rxcsr);
|
||||||
|
} else {
|
||||||
csr = readw(&musbr->rxcsr);
|
csr = readw(&musbr->rxcsr);
|
||||||
csr |= MUSB_RXCSR_H_WR_DATATOGGLE;
|
csr |= MUSB_RXCSR_H_WR_DATATOGGLE;
|
||||||
writew(csr, &musbr->rxcsr);
|
writew(csr, &musbr->rxcsr);
|
||||||
|
Loading…
Reference in New Issue
Block a user