1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). |
1 // Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). |
2 // All rights reserved. |
2 // All rights reserved. |
3 // This component and the accompanying materials are made available |
3 // This component and the accompanying materials are made available |
4 // under the terms of the License "Eclipse Public License v1.0" |
4 // under the terms of the License "Eclipse Public License v1.0" |
5 // which accompanies this distribution, and is available |
5 // which accompanies this distribution, and is available |
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
17 @file |
17 @file |
18 @internalTechnology |
18 @internalTechnology |
19 */ |
19 */ |
20 |
20 |
21 #include <e32base.h> |
21 #include <e32base.h> |
22 #include "debug.h" |
22 |
23 #include "msdebug.h" |
23 #include "OstTraceDefinitions.h" |
|
24 #ifdef OST_TRACE_COMPILER_IN_USE |
|
25 #include "tscsiblockcmdsTraces.h" |
|
26 #endif |
|
27 |
24 #include "msctypes.h" |
28 #include "msctypes.h" |
25 #include "mscutils.h" |
29 #include "mscutils.h" |
26 |
30 |
27 #include "mtransport.h" |
31 #include "mtransport.h" |
28 #include "mprotocol.h" |
32 #include "mprotocol.h" |
29 #include "tscsiclientreq.h" |
33 #include "tscsiclientreq.h" |
30 #include "tscsiblockcmds.h" |
34 #include "tscsiblockcmds.h" |
31 |
35 |
32 |
36 |
33 // **** MODE SENSE (6) **** |
37 // **** MODE SENSE (6) **** |
34 void TScsiClientModeSense6Resp::DecodeL(const TDesC8& aPtr) |
38 void TScsiClientModeSense6Resp::DecodeL(const TDesC8& aPtr) |
35 { |
39 { |
36 __MSFNSLOG |
40 OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_10, |
37 __SCSIPRINT(_L("--> SCSI MODE SENSE (6)")); |
41 "--> SCSI MODE SENSE (6)"); |
38 __SCSIPRINT1(_L("len=%d"), aPtr.Length()); |
42 OstTrace1(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_11, |
|
43 "len=%d", aPtr.Length()); |
39 // Mode Parameter List |
44 // Mode Parameter List |
40 // SPC-3 7.4.2 |
45 // SPC-3 7.4.2 |
41 // - Mode Parameter Header |
46 // - Mode Parameter Header |
42 // - Block Descriptor(s) |
47 // - Block Descriptor(s) |
43 // - Mode Page(s) |
48 // - Mode Page(s) |
59 TInt modeDataLength = aPtr[0]; |
64 TInt modeDataLength = aPtr[0]; |
60 if (aPtr.Length() - 1 > modeDataLength) |
65 if (aPtr.Length() - 1 > modeDataLength) |
61 { |
66 { |
62 User::Leave(KErrGeneral); |
67 User::Leave(KErrGeneral); |
63 } |
68 } |
64 |
69 |
65 TInt mediumType = aPtr[1]; |
70 TInt mediumType = aPtr[1]; |
66 TUint8 deviceSpecificParameter = aPtr[2]; |
71 TUint8 deviceSpecificParameter = aPtr[2]; |
67 // TInt blockDescriptorLength = aPtr[3]; |
72 // TInt blockDescriptorLength = aPtr[3]; |
68 |
73 |
69 __SCSIPRINT2(_L("Medium Type=%d DSP=0x%x"), mediumType, deviceSpecificParameter); |
74 OstTraceExt2(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_20, |
|
75 "Medium Type=%d DSP=0x%x", mediumType, deviceSpecificParameter); |
70 // [1] Medium Type |
76 // [1] Medium Type |
71 // 0x00 for SBC |
77 // 0x00 for SBC |
72 if (mediumType == 0) |
78 if (mediumType == 0) |
73 { |
79 { |
74 // [2] Device specific parameter |
80 // [2] Device specific parameter |
87 |
93 |
88 // No Block Descriptors |
94 // No Block Descriptors |
89 |
95 |
90 // No Mode Pages |
96 // No Mode Pages |
91 |
97 |
92 } |
98 } |
93 |
99 |
94 |
100 |
95 // **** MODE SENSE (10) **** |
101 // **** MODE SENSE (10) **** |
96 void TScsiClientModeSense10Resp::DecodeL(const TDesC8& aPtr) |
102 void TScsiClientModeSense10Resp::DecodeL(const TDesC8& aPtr) |
97 { |
103 { |
98 __MSFNSLOG |
104 OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_30, |
99 __SCSIPRINT(_L("--> SCSI MODE SENSE (10)")); |
105 "--> SCSI MODE SENSE (10)"); |
100 __SCSIPRINT1(_L("len=%d"), aPtr.Length()); |
106 OstTrace1(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_31, |
|
107 "len=%d", aPtr.Length()); |
101 // Mode Parameter List |
108 // Mode Parameter List |
102 // SPC-3 7.4.2 |
109 // SPC-3 7.4.2 |
103 // - Mode Parameter Header |
110 // - Mode Parameter Header |
104 // - Block Descriptor(s) |
111 // - Block Descriptor(s) |
105 // - Mode Page(s) |
112 // - Mode Page(s) |
118 // validate length |
125 // validate length |
119 if (aPtr.Length() < KResponseLength) |
126 if (aPtr.Length() < KResponseLength) |
120 { |
127 { |
121 User::Leave(KErrGeneral); |
128 User::Leave(KErrGeneral); |
122 } |
129 } |
123 |
130 |
124 TInt modeDataLength = BigEndian::Get16(&aPtr[0]); |
131 TInt modeDataLength = BigEndian::Get16(&aPtr[0]); |
125 if (aPtr.Length() - 2 > modeDataLength) |
132 if (aPtr.Length() - 2 > modeDataLength) |
126 { |
133 { |
127 User::Leave(KErrGeneral); |
134 User::Leave(KErrGeneral); |
128 } |
135 } |
129 |
136 |
130 TInt mediumType = aPtr[2]; |
137 TInt mediumType = aPtr[2]; |
131 TUint8 deviceSpecificParameter = aPtr[3]; |
138 TUint8 deviceSpecificParameter = aPtr[3]; |
132 // TInt blockDescriptorLength = BigEndian::Get32(&aPtr[6]);; |
139 // TInt blockDescriptorLength = BigEndian::Get32(&aPtr[6]);; |
133 |
140 |
134 __SCSIPRINT2(_L("Medium Type=%d DSP=0x%x"), mediumType, deviceSpecificParameter); |
141 OstTraceExt2(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_40, |
|
142 "Medium Type=%d DSP=0x%x", mediumType, deviceSpecificParameter); |
135 // [1] Medium Type |
143 // [1] Medium Type |
136 // 0x00 for SBC |
144 // 0x00 for SBC |
137 if (mediumType == 0) |
145 if (mediumType == 0) |
138 { |
146 { |
139 // [2] Device specific parameter |
147 // [2] Device specific parameter |
152 |
160 |
153 // No Block Descriptors |
161 // No Block Descriptors |
154 |
162 |
155 // No Mode Pages |
163 // No Mode Pages |
156 |
164 |
157 } |
165 } |
158 |
166 |
159 |
167 |
160 |
168 |
161 // **** READ CAPACITY (10) *** |
169 // **** READ CAPACITY (10) *** |
162 TInt TScsiClientReadCapacity10Req::EncodeRequestL(TDes8& aBuffer) const |
170 TInt TScsiClientReadCapacity10Req::EncodeRequestL(TDes8& aBuffer) const |
163 { |
171 { |
164 __MSFNSLOG |
172 OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_50, |
165 __SCSIPRINT(_L("<-- READ CAPACITY 10")); |
173 "<-- READ CAPACITY 10"); |
166 TInt length = TScsiClientReq::EncodeRequestL(aBuffer); |
174 TInt length = TScsiClientReq::EncodeRequestL(aBuffer); |
167 |
175 |
168 if (iLba) |
176 if (iLba) |
169 { |
177 { |
170 // PMI bit |
178 // PMI bit |
175 return length; |
183 return length; |
176 } |
184 } |
177 |
185 |
178 |
186 |
179 void TScsiClientReadCapacity10Resp::DecodeL(const TDesC8& aPtr) |
187 void TScsiClientReadCapacity10Resp::DecodeL(const TDesC8& aPtr) |
180 { |
188 { |
181 __MSFNSLOG |
189 OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_60, |
182 __SCSIPRINT(_L("--> SCSI READ CAPACITY (10)")); |
190 "--> SCSI READ CAPACITY (10)"); |
183 iLba = BigEndian::Get32(&aPtr[0]); |
191 iLba = BigEndian::Get32(&aPtr[0]); |
184 iBlockSize = BigEndian::Get32(&aPtr[4]); |
192 iBlockSize = BigEndian::Get32(&aPtr[4]); |
185 } |
193 } |
186 |
194 |
187 |
195 |
188 // **** RdWr10 **** |
196 // **** RdWr10 **** |
189 TInt TScsiClientRdWr10Req::EncodeRequestL(TDes8& aBuffer) const |
197 TInt TScsiClientRdWr10Req::EncodeRequestL(TDes8& aBuffer) const |
190 { |
198 { |
191 __MSFNSLOG |
|
192 TInt length = TScsiClientReq::EncodeRequestL(aBuffer); |
199 TInt length = TScsiClientReq::EncodeRequestL(aBuffer); |
193 |
200 |
194 // PROTECT |
201 // PROTECT |
195 if (iProtect) |
202 if (iProtect) |
196 aBuffer[1] = iProtect << 5; |
203 aBuffer[1] = iProtect << 5; |
197 |
204 |
198 __SCSIPRINT2(_L("LBA=%08x LEN=%08x"), iLogicalBlockAddress, iBlockTransferLength); |
205 OstTraceExt2(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_70, |
|
206 "LBA=%08x LEN=%08x", iLogicalBlockAddress, iBlockTransferLength); |
199 // LOGICAL BLOCK ADDRESS |
207 // LOGICAL BLOCK ADDRESS |
200 BigEndian::Put32(&aBuffer[2], iLogicalBlockAddress); |
208 BigEndian::Put32(&aBuffer[2], iLogicalBlockAddress); |
201 // TRANSFER LENGTH |
209 // TRANSFER LENGTH |
202 BigEndian::Put16(&aBuffer[7], iBlockTransferLength); |
210 BigEndian::Put16(&aBuffer[7], iBlockTransferLength); |
203 return length; |
211 return length; |
204 } |
212 } |
205 |
213 |
206 // **** READ (10) **** |
214 // **** READ (10) **** |
207 TInt TScsiClientRead10Req::EncodeRequestL(TDes8& aBuffer) const |
215 TInt TScsiClientRead10Req::EncodeRequestL(TDes8& aBuffer) const |
208 { |
216 { |
209 __MSFNSLOG |
217 OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_80, |
210 __SCSIPRINT(_L("<-- SCSI READ (10)")); |
218 "<-- SCSI READ (10)"); |
211 TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer); |
219 TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer); |
212 return length; |
220 return length; |
213 } |
221 } |
214 |
222 |
215 |
223 |
216 // **** START STOP UNIT **** |
224 // **** START STOP UNIT **** |
217 TInt TScsiClientStartStopUnitReq::EncodeRequestL(TDes8& aBuffer) const |
225 TInt TScsiClientStartStopUnitReq::EncodeRequestL(TDes8& aBuffer) const |
218 { |
226 { |
219 __MSFNSLOG |
227 OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_90, |
220 __SCSIPRINT(_L("--> SCSI START STOP UNIT")); |
228 "--> SCSI START STOP UNIT"); |
221 TInt length = TScsiClientReq::EncodeRequestL(aBuffer); |
229 TInt length = TScsiClientReq::EncodeRequestL(aBuffer); |
222 |
230 |
223 // byte 1 mask |
231 // byte 1 mask |
224 const TUint8 KImmedMask = 0x01; |
232 const TUint8 KImmedMask = 0x01; |
225 |
233 |
235 aBuffer[4] |= KLoejMask; |
243 aBuffer[4] |= KLoejMask; |
236 return length; |
244 return length; |
237 } |
245 } |
238 |
246 |
239 |
247 |
240 // **** WRITE (10) **** |
248 // **** WRITE (10) **** |
241 TInt TScsiClientWrite10Req::EncodeRequestL(TDes8& aBuffer) const |
249 TInt TScsiClientWrite10Req::EncodeRequestL(TDes8& aBuffer) const |
242 { |
250 { |
243 __MSFNSLOG |
251 OstTrace0(TRACE_SHOSTMASSSTORAGE_SCSI, TSCSIBLOCKCMDS_91, |
244 __SCSIPRINT(_L("<-- SCSI WRITE 10")); |
252 "<-- SCSI WRITE 10"); |
245 |
253 |
246 TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer); |
254 TInt length = TScsiClientRdWr10Req::EncodeRequestL(aBuffer); |
247 return length; |
255 return length; |
248 } |
256 } |
249 |
257 |