diff options
author | Lluís Batlle i Rossell <viric@vicerveza.homeunix.net> | 2010-10-07 21:21:31 +0000 |
---|---|---|
committer | Lluís Batlle i Rossell <viric@vicerveza.homeunix.net> | 2010-10-07 21:21:31 +0000 |
commit | fca582bff0ab8887835ca10495620d0ac15ab10a (patch) | |
tree | 0934656b725b9a5da0acb8025f3a9ceab2e63d90 /pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch | |
parent | 2291f661b03f29fd59549165721a1426e5d04264 (diff) | |
parent | 89a3dc9adac5aa195ec9334c2f7e255e02388157 (diff) | |
download | nixpkgs-fca582bff0ab8887835ca10495620d0ac15ab10a.tar nixpkgs-fca582bff0ab8887835ca10495620d0ac15ab10a.tar.gz nixpkgs-fca582bff0ab8887835ca10495620d0ac15ab10a.tar.bz2 nixpkgs-fca582bff0ab8887835ca10495620d0ac15ab10a.tar.lz nixpkgs-fca582bff0ab8887835ca10495620d0ac15ab10a.tar.xz nixpkgs-fca582bff0ab8887835ca10495620d0ac15ab10a.tar.zst nixpkgs-fca582bff0ab8887835ca10495620d0ac15ab10a.zip |
Updating from trunk. I had to resolve the pcre and some stdenv2 in all-packages
svn path=/nixpkgs/branches/stdenv-updates/; revision=24155
Diffstat (limited to 'pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch')
-rw-r--r-- | pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch b/pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch new file mode 100644 index 00000000000..4f32dd89031 --- /dev/null +++ b/pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch @@ -0,0 +1,106 @@ +The GuruPlug's microSD card reader is a USB mass storage device that +has two logical units (LUNs), i.e., two "SCSI disks". This patch +adds multi-LUN support to the USB MSD driver. + +See the thread at <http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/85425>. + +--- u-boot/common/usb_storage.c 1970-01-01 01:00:01.000000000 +0100 ++++ u-boot/common/usb_storage.c 2010-10-02 00:38:15.000000000 +0200 +@@ -204,6 +204,22 @@ int usb_stor_info(void) + 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 + * to the user if mode = 1 +@@ -241,13 +257,21 @@ int usb_stor_scan(int mode) + break; /* no more devices avaiable */ + + if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) { +- /* ok, it is a storage devices +- * get info and fill it in +- */ +- if (usb_stor_get_info(dev, &usb_stor[usb_max_devs], +- &usb_dev_desc[usb_max_devs]) == 1) ++ /* OK, it's a storage device. Iterate over its LUNs ++ * and populate `usb_dev_desc'. */ ++ int lun, max_lun, start = usb_max_devs; ++ ++ 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++; + } ++ } ++ } + /* if storage device */ + if (usb_max_devs == USB_MAX_STOR_DEV) { + printf("max USB Storage Device reached: %d stopping\n", +@@ -882,6 +906,7 @@ static int usb_inquiry(ccb *srb, struct + do { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_INQUIRY; ++ srb->cmd[1] = srb->lun << 5; + srb->cmd[4] = 36; + srb->datalen = 36; + srb->cmdlen = 12; +@@ -905,6 +930,7 @@ static int usb_request_sense(ccb *srb, s + ptr = (char *)srb->pdata; + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_REQ_SENSE; ++ srb->cmd[1] = srb->lun << 5; + srb->cmd[4] = 18; + srb->datalen = 18; + srb->pdata = &srb->sense_buf[0]; +@@ -924,6 +950,7 @@ static int usb_test_unit_ready(ccb *srb, + do { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_TST_U_RDY; ++ srb->cmd[1] = srb->lun << 5; + srb->datalen = 0; + srb->cmdlen = 12; + if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD) +@@ -943,6 +970,7 @@ static int usb_read_capacity(ccb *srb, s + do { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_RD_CAPAC; ++ srb->cmd[1] = srb->lun << 5; + srb->datalen = 8; + srb->cmdlen = 12; + if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD) +@@ -957,6 +985,7 @@ static int usb_read_10(ccb *srb, struct + { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_READ10; ++ srb->cmd[1] = srb->lun << 5; + srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff; + srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff; + srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff; +@@ -973,6 +1002,7 @@ static int usb_write_10(ccb *srb, struct + { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_WRITE10; ++ srb->cmd[1] = srb->lun << 5; + srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff; + srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff; + srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff; |