1 #include <linux/sched.h>
2 #include <linux/errno.h>
3 #include <linux/slab.h>
6 #include <scsi/scsi_eh.h>
7 #include <scsi/scsi_device.h>
11 #include "transport.h"
14 int SM_SCSI_Test_Unit_Ready(struct us_data
*us
, struct scsi_cmnd
*srb
);
15 int SM_SCSI_Inquiry(struct us_data
*us
, struct scsi_cmnd
*srb
);
16 int SM_SCSI_Mode_Sense(struct us_data
*us
, struct scsi_cmnd
*srb
);
17 int SM_SCSI_Start_Stop(struct us_data
*us
, struct scsi_cmnd
*srb
);
18 int SM_SCSI_Read_Capacity(struct us_data
*us
, struct scsi_cmnd
*srb
);
19 int SM_SCSI_Read(struct us_data
*us
, struct scsi_cmnd
*srb
);
20 int SM_SCSI_Write(struct us_data
*us
, struct scsi_cmnd
*srb
);
22 extern PBYTE SMHostAddr
;
23 extern DWORD ErrXDCode
;
25 /* ----- SM_SCSIIrp() -------------------------------------------------- */
26 int SM_SCSIIrp(struct us_data
*us
, struct scsi_cmnd
*srb
)
30 us
->SrbStatus
= SS_SUCCESS
;
31 switch (srb
->cmnd
[0]) {
33 result
= SM_SCSI_Test_Unit_Ready(us
, srb
);
36 result
= SM_SCSI_Inquiry(us
, srb
);
39 result
= SM_SCSI_Mode_Sense(us
, srb
);
42 result
= SM_SCSI_Read_Capacity(us
, srb
);
45 result
= SM_SCSI_Read(us
, srb
);
48 result
= SM_SCSI_Write(us
, srb
);
52 us
->SrbStatus
= SS_ILLEGAL_REQUEST
;
53 result
= USB_STOR_TRANSPORT_FAILED
;
59 /* ----- SM_SCSI_Test_Unit_Ready() -------------------------------------------------- */
60 int SM_SCSI_Test_Unit_Ready(struct us_data
*us
, struct scsi_cmnd
*srb
)
62 if (us
->SM_Status
.Insert
&& us
->SM_Status
.Ready
)
63 return USB_STOR_TRANSPORT_GOOD
;
66 return USB_STOR_TRANSPORT_GOOD
;
69 return USB_STOR_TRANSPORT_GOOD
;
72 /* ----- SM_SCSI_Inquiry() -------------------------------------------------- */
73 int SM_SCSI_Inquiry(struct us_data
*us
, struct scsi_cmnd
*srb
)
75 BYTE data_ptr
[36] = {0x00, 0x80, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x55, 0x53, 0x42, 0x32, 0x2E, 0x30, 0x20, 0x20, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x30, 0x30};
77 usb_stor_set_xfer_buf(us
, data_ptr
, 36, srb
, TO_XFER_BUF
);
78 return USB_STOR_TRANSPORT_GOOD
;
82 /* ----- SM_SCSI_Mode_Sense() -------------------------------------------------- */
83 int SM_SCSI_Mode_Sense(struct us_data
*us
, struct scsi_cmnd
*srb
)
85 BYTE mediaNoWP
[12] = {0x0b, 0x00, 0x00, 0x08, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00};
86 BYTE mediaWP
[12] = {0x0b, 0x00, 0x80, 0x08, 0x00, 0x00, 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00};
88 if (us
->SM_Status
.WtP
)
89 usb_stor_set_xfer_buf(us
, mediaWP
, 12, srb
, TO_XFER_BUF
);
91 usb_stor_set_xfer_buf(us
, mediaNoWP
, 12, srb
, TO_XFER_BUF
);
94 return USB_STOR_TRANSPORT_GOOD
;
97 /* ----- SM_SCSI_Read_Capacity() -------------------------------------------------- */
98 int SM_SCSI_Read_Capacity(struct us_data
*us
, struct scsi_cmnd
*srb
)
100 unsigned int offset
= 0;
101 struct scatterlist
*sg
= NULL
;
106 printk("SM_SCSI_Read_Capacity\n");
109 bl_num
= Ssfdc
.MaxLogBlocks
* Ssfdc
.MaxSectors
* Ssfdc
.MaxZones
- 1;
112 printk("bl_len = %x\n", bl_len
);
113 printk("bl_num = %x\n", bl_num
);
115 buf
[0] = (bl_num
>> 24) & 0xff;
116 buf
[1] = (bl_num
>> 16) & 0xff;
117 buf
[2] = (bl_num
>> 8) & 0xff;
118 buf
[3] = (bl_num
>> 0) & 0xff;
119 buf
[4] = (bl_len
>> 24) & 0xff;
120 buf
[5] = (bl_len
>> 16) & 0xff;
121 buf
[6] = (bl_len
>> 8) & 0xff;
122 buf
[7] = (bl_len
>> 0) & 0xff;
124 usb_stor_access_xfer_buf(us
, buf
, 8, srb
, &sg
, &offset
, TO_XFER_BUF
);
126 return USB_STOR_TRANSPORT_GOOD
;
129 /* ----- SM_SCSI_Read() -------------------------------------------------- */
130 int SM_SCSI_Read(struct us_data
*us
, struct scsi_cmnd
*srb
)
133 PBYTE Cdb
= srb
->cmnd
;
134 DWORD bn
= ((Cdb
[2] << 24) & 0xff000000) | ((Cdb
[3] << 16) & 0x00ff0000) |
135 ((Cdb
[4] << 8) & 0x0000ff00) | ((Cdb
[5] << 0) & 0x000000ff);
136 WORD blen
= ((Cdb
[7] << 8) & 0xff00) | ((Cdb
[8] << 0) & 0x00ff);
137 DWORD blenByte
= blen
* 0x200;
142 return USB_STOR_TRANSPORT_ERROR
;
144 buf
= kmalloc(blenByte
, GFP_KERNEL
);
146 return USB_STOR_TRANSPORT_ERROR
;
147 result
= Media_D_ReadSector(us
, bn
, blen
, buf
);
148 usb_stor_set_xfer_buf(us
, buf
, blenByte
, srb
, TO_XFER_BUF
);
152 return USB_STOR_TRANSPORT_GOOD
;
154 return USB_STOR_TRANSPORT_ERROR
;
156 return USB_STOR_TRANSPORT_GOOD
;
159 /* ----- SM_SCSI_Write() -------------------------------------------------- */
160 int SM_SCSI_Write(struct us_data
*us
, struct scsi_cmnd
*srb
)
163 PBYTE Cdb
= srb
->cmnd
;
164 DWORD bn
= ((Cdb
[2] << 24) & 0xff000000) | ((Cdb
[3] << 16) & 0x00ff0000) |
165 ((Cdb
[4] << 8) & 0x0000ff00) | ((Cdb
[5] << 0) & 0x000000ff);
166 WORD blen
= ((Cdb
[7] << 8) & 0xff00) | ((Cdb
[8] << 0) & 0x00ff);
167 DWORD blenByte
= blen
* 0x200;
172 return USB_STOR_TRANSPORT_ERROR
;
174 buf
= kmalloc(blenByte
, GFP_KERNEL
);
176 return USB_STOR_TRANSPORT_ERROR
;
177 usb_stor_set_xfer_buf(us
, buf
, blenByte
, srb
, FROM_XFER_BUF
);
178 result
= Media_D_CopySector(us
, bn
, blen
, buf
);
182 return USB_STOR_TRANSPORT_GOOD
;
184 return USB_STOR_TRANSPORT_ERROR
;
186 return USB_STOR_TRANSPORT_GOOD
;