2017-11-03 13:28:30 +03:00
// SPDX-License-Identifier: GPL-2.0+
2016-04-18 13:09:11 +03:00
/*
* Special Initializers for certain USB Mass Storage devices
2005-04-17 02:20:36 +04:00
*
* Current development and maintenance by :
* ( c ) 1999 , 2000 Matthew Dharm ( mdharm - usb @ one - eyed - alien . net )
*
* This driver is based on the ' USB Mass Storage Class ' document . This
* describes in detail the protocol used to communicate with such
* devices . Clearly , the designers had SCSI and ATAPI commands in
* mind when they created this document . The commands are all very
* similar to commands in the SCSI - II and ATAPI specifications .
*
* It is important to note that in a number of cases this class
* exhibits class - specific exemptions from the USB specification .
* Notably the usage of NAK , STALL and ACK differs from the norm , in
* that they are used to communicate wait , failed and OK on commands .
*
* Also , for certain devices , the interrupt endpoint is used to convey
* status of a command .
*/
# include <linux/errno.h>
# include "usb.h"
# include "initializers.h"
# include "debug.h"
# include "transport.h"
2016-04-18 13:09:11 +03:00
/*
* This places the Shuttle / SCM USB < - > SCSI bridge devices in multi - target
* mode
*/
2005-04-17 02:20:36 +04:00
int usb_stor_euscsi_init ( struct us_data * us )
{
int result ;
2013-04-19 22:44:00 +04:00
usb_stor_dbg ( us , " Attempting to init eUSCSI bridge... \n " ) ;
2005-04-17 02:20:36 +04:00
result = usb_stor_control_msg ( us , us - > send_ctrl_pipe ,
0x0C , USB_RECIP_INTERFACE | USB_TYPE_VENDOR ,
2014-11-08 01:02:19 +03:00
0x01 , 0x0 , NULL , 0x0 , 5 * HZ ) ;
2013-04-19 22:44:00 +04:00
usb_stor_dbg ( us , " -- result is %d \n " , result ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
2016-04-18 13:09:11 +03:00
/*
* This function is required to activate all four slots on the UCR - 61 S2B
* flash reader
*/
2005-04-17 02:20:36 +04:00
int usb_stor_ucr61s2b_init ( struct us_data * us )
{
struct bulk_cb_wrap * bcb = ( struct bulk_cb_wrap * ) us - > iobuf ;
struct bulk_cs_wrap * bcs = ( struct bulk_cs_wrap * ) us - > iobuf ;
2007-12-16 05:21:29 +03:00
int res ;
unsigned int partial ;
2005-04-17 02:20:36 +04:00
static char init_string [ ] = " \xec \x0a \x06 \x00 $PCCHIPS " ;
2013-04-19 22:44:00 +04:00
usb_stor_dbg ( us , " Sending UCR-61S2B initialization packet... \n " ) ;
2005-04-17 02:20:36 +04:00
bcb - > Signature = cpu_to_le32 ( US_BULK_CB_SIGN ) ;
bcb - > Tag = 0 ;
bcb - > DataTransferLength = cpu_to_le32 ( 0 ) ;
bcb - > Flags = bcb - > Lun = 0 ;
bcb - > Length = sizeof ( init_string ) - 1 ;
memset ( bcb - > CDB , 0 , sizeof ( bcb - > CDB ) ) ;
memcpy ( bcb - > CDB , init_string , sizeof ( init_string ) - 1 ) ;
res = usb_stor_bulk_transfer_buf ( us , us - > send_bulk_pipe , bcb ,
US_BULK_CB_WRAP_LEN , & partial ) ;
2009-04-30 02:02:18 +04:00
if ( res )
return - EIO ;
2005-04-17 02:20:36 +04:00
2013-04-19 22:44:00 +04:00
usb_stor_dbg ( us , " Getting status packet... \n " ) ;
2005-04-17 02:20:36 +04:00
res = usb_stor_bulk_transfer_buf ( us , us - > recv_bulk_pipe , bcs ,
US_BULK_CS_WRAP_LEN , & partial ) ;
2009-04-30 02:02:18 +04:00
if ( res )
return - EIO ;
2005-04-17 02:20:36 +04:00
2009-04-30 02:02:18 +04:00
return 0 ;
2005-04-17 02:20:36 +04:00
}
2007-09-05 15:49:29 +04:00
2013-03-04 17:19:21 +04:00
/* This places the HUAWEI E220 devices in multi-port mode */
int usb_stor_huawei_e220_init ( struct us_data * us )
2007-09-05 15:49:29 +04:00
{
int result ;
result = usb_stor_control_msg ( us , us - > send_ctrl_pipe ,
USB_REQ_SET_FEATURE ,
USB_TYPE_STANDARD | USB_RECIP_DEVICE ,
2014-11-04 16:00:24 +03:00
0x01 , 0x0 , NULL , 0x0 , 1 * HZ ) ;
2013-04-19 22:44:00 +04:00
usb_stor_dbg ( us , " Huawei mode set result is %d \n " , result ) ;
2009-08-07 08:30:35 +04:00
return 0 ;
2007-09-05 15:49:29 +04:00
}