umass.c (190172) | umass.c (190186) |
---|---|
1#include <sys/cdefs.h> | 1#include <sys/cdefs.h> |
2__FBSDID("$FreeBSD: head/sys/dev/usb/storage/umass.c 190172 2009-03-20 18:56:27Z thompsa $"); | 2__FBSDID("$FreeBSD: head/sys/dev/usb/storage/umass.c 190186 2009-03-20 22:10:36Z thompsa $"); |
3 4/*- 5 * Copyright (c) 1999 MAEKAWA Masahide <bishop@rr.iij4u.or.jp>, 6 * Nick Hibma <n_hibma@FreeBSD.org> 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions --- 11 unchanged lines hidden (view full) --- 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * | 3 4/*- 5 * Copyright (c) 1999 MAEKAWA Masahide <bishop@rr.iij4u.or.jp>, 6 * Nick Hibma <n_hibma@FreeBSD.org> 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions --- 11 unchanged lines hidden (view full) --- 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * |
30 * $FreeBSD: head/sys/dev/usb/storage/umass.c 190172 2009-03-20 18:56:27Z thompsa $ | 30 * $FreeBSD: head/sys/dev/usb/storage/umass.c 190186 2009-03-20 22:10:36Z thompsa $ |
31 * $NetBSD: umass.c,v 1.28 2000/04/02 23:46:53 augustss Exp $ 32 */ 33 34/* Also already merged from NetBSD: 35 * $NetBSD: umass.c,v 1.67 2001/11/25 19:05:22 augustss Exp $ 36 * $NetBSD: umass.c,v 1.90 2002/11/04 19:17:33 pooka Exp $ 37 * $NetBSD: umass.c,v 1.108 2003/11/07 17:03:25 wiz Exp $ 38 * $NetBSD: umass.c,v 1.109 2003/12/04 13:57:31 keihan Exp $ --- 1019 unchanged lines hidden (view full) --- 1058 1059struct usb2_config umass_bbb_config[UMASS_T_BBB_MAX] = { 1060 1061 [UMASS_T_BBB_RESET1] = { 1062 .type = UE_CONTROL, 1063 .endpoint = 0x00, /* Control pipe */ 1064 .direction = UE_DIR_ANY, 1065 .mh.bufsize = sizeof(struct usb2_device_request), | 31 * $NetBSD: umass.c,v 1.28 2000/04/02 23:46:53 augustss Exp $ 32 */ 33 34/* Also already merged from NetBSD: 35 * $NetBSD: umass.c,v 1.67 2001/11/25 19:05:22 augustss Exp $ 36 * $NetBSD: umass.c,v 1.90 2002/11/04 19:17:33 pooka Exp $ 37 * $NetBSD: umass.c,v 1.108 2003/11/07 17:03:25 wiz Exp $ 38 * $NetBSD: umass.c,v 1.109 2003/12/04 13:57:31 keihan Exp $ --- 1019 unchanged lines hidden (view full) --- 1058 1059struct usb2_config umass_bbb_config[UMASS_T_BBB_MAX] = { 1060 1061 [UMASS_T_BBB_RESET1] = { 1062 .type = UE_CONTROL, 1063 .endpoint = 0x00, /* Control pipe */ 1064 .direction = UE_DIR_ANY, 1065 .mh.bufsize = sizeof(struct usb2_device_request), |
1066 .mh.flags = {}, | |
1067 .mh.callback = &umass_t_bbb_reset1_callback, 1068 .mh.timeout = 5000, /* 5 seconds */ 1069 .mh.interval = 500, /* 500 milliseconds */ 1070 }, 1071 1072 [UMASS_T_BBB_RESET2] = { 1073 .type = UE_CONTROL, 1074 .endpoint = 0x00, /* Control pipe */ 1075 .direction = UE_DIR_ANY, 1076 .mh.bufsize = sizeof(struct usb2_device_request), | 1066 .mh.callback = &umass_t_bbb_reset1_callback, 1067 .mh.timeout = 5000, /* 5 seconds */ 1068 .mh.interval = 500, /* 500 milliseconds */ 1069 }, 1070 1071 [UMASS_T_BBB_RESET2] = { 1072 .type = UE_CONTROL, 1073 .endpoint = 0x00, /* Control pipe */ 1074 .direction = UE_DIR_ANY, 1075 .mh.bufsize = sizeof(struct usb2_device_request), |
1077 .mh.flags = {}, | |
1078 .mh.callback = &umass_t_bbb_reset2_callback, 1079 .mh.timeout = 5000, /* 5 seconds */ 1080 .mh.interval = 50, /* 50 milliseconds */ 1081 }, 1082 1083 [UMASS_T_BBB_RESET3] = { 1084 .type = UE_CONTROL, 1085 .endpoint = 0x00, /* Control pipe */ 1086 .direction = UE_DIR_ANY, 1087 .mh.bufsize = sizeof(struct usb2_device_request), | 1076 .mh.callback = &umass_t_bbb_reset2_callback, 1077 .mh.timeout = 5000, /* 5 seconds */ 1078 .mh.interval = 50, /* 50 milliseconds */ 1079 }, 1080 1081 [UMASS_T_BBB_RESET3] = { 1082 .type = UE_CONTROL, 1083 .endpoint = 0x00, /* Control pipe */ 1084 .direction = UE_DIR_ANY, 1085 .mh.bufsize = sizeof(struct usb2_device_request), |
1088 .mh.flags = {}, | |
1089 .mh.callback = &umass_t_bbb_reset3_callback, 1090 .mh.timeout = 5000, /* 5 seconds */ 1091 .mh.interval = 50, /* 50 milliseconds */ 1092 }, 1093 1094 [UMASS_T_BBB_COMMAND] = { 1095 .type = UE_BULK, 1096 .endpoint = UE_ADDR_ANY, 1097 .direction = UE_DIR_OUT, 1098 .mh.bufsize = sizeof(umass_bbb_cbw_t), | 1086 .mh.callback = &umass_t_bbb_reset3_callback, 1087 .mh.timeout = 5000, /* 5 seconds */ 1088 .mh.interval = 50, /* 50 milliseconds */ 1089 }, 1090 1091 [UMASS_T_BBB_COMMAND] = { 1092 .type = UE_BULK, 1093 .endpoint = UE_ADDR_ANY, 1094 .direction = UE_DIR_OUT, 1095 .mh.bufsize = sizeof(umass_bbb_cbw_t), |
1099 .mh.flags = {}, | |
1100 .mh.callback = &umass_t_bbb_command_callback, 1101 .mh.timeout = 5000, /* 5 seconds */ 1102 }, 1103 1104 [UMASS_T_BBB_DATA_READ] = { 1105 .type = UE_BULK, 1106 .endpoint = UE_ADDR_ANY, 1107 .direction = UE_DIR_IN, 1108 .mh.bufsize = UMASS_BULK_SIZE, 1109 .mh.flags = {.proxy_buffer = 1,.short_xfer_ok = 1, UMASS_USB_FLAGS}, 1110 .mh.callback = &umass_t_bbb_data_read_callback, 1111 .mh.timeout = 0, /* overwritten later */ 1112 }, 1113 1114 [UMASS_T_BBB_DATA_RD_CS] = { 1115 .type = UE_CONTROL, 1116 .endpoint = 0x00, /* Control pipe */ 1117 .direction = UE_DIR_ANY, 1118 .mh.bufsize = sizeof(struct usb2_device_request), | 1096 .mh.callback = &umass_t_bbb_command_callback, 1097 .mh.timeout = 5000, /* 5 seconds */ 1098 }, 1099 1100 [UMASS_T_BBB_DATA_READ] = { 1101 .type = UE_BULK, 1102 .endpoint = UE_ADDR_ANY, 1103 .direction = UE_DIR_IN, 1104 .mh.bufsize = UMASS_BULK_SIZE, 1105 .mh.flags = {.proxy_buffer = 1,.short_xfer_ok = 1, UMASS_USB_FLAGS}, 1106 .mh.callback = &umass_t_bbb_data_read_callback, 1107 .mh.timeout = 0, /* overwritten later */ 1108 }, 1109 1110 [UMASS_T_BBB_DATA_RD_CS] = { 1111 .type = UE_CONTROL, 1112 .endpoint = 0x00, /* Control pipe */ 1113 .direction = UE_DIR_ANY, 1114 .mh.bufsize = sizeof(struct usb2_device_request), |
1119 .mh.flags = {}, | |
1120 .mh.callback = &umass_t_bbb_data_rd_cs_callback, 1121 .mh.timeout = 5000, /* 5 seconds */ 1122 }, 1123 1124 [UMASS_T_BBB_DATA_WRITE] = { 1125 .type = UE_BULK, 1126 .endpoint = UE_ADDR_ANY, 1127 .direction = UE_DIR_OUT, 1128 .mh.bufsize = UMASS_BULK_SIZE, 1129 .mh.flags = {.proxy_buffer = 1,.short_xfer_ok = 1, UMASS_USB_FLAGS}, 1130 .mh.callback = &umass_t_bbb_data_write_callback, 1131 .mh.timeout = 0, /* overwritten later */ 1132 }, 1133 1134 [UMASS_T_BBB_DATA_WR_CS] = { 1135 .type = UE_CONTROL, 1136 .endpoint = 0x00, /* Control pipe */ 1137 .direction = UE_DIR_ANY, 1138 .mh.bufsize = sizeof(struct usb2_device_request), | 1115 .mh.callback = &umass_t_bbb_data_rd_cs_callback, 1116 .mh.timeout = 5000, /* 5 seconds */ 1117 }, 1118 1119 [UMASS_T_BBB_DATA_WRITE] = { 1120 .type = UE_BULK, 1121 .endpoint = UE_ADDR_ANY, 1122 .direction = UE_DIR_OUT, 1123 .mh.bufsize = UMASS_BULK_SIZE, 1124 .mh.flags = {.proxy_buffer = 1,.short_xfer_ok = 1, UMASS_USB_FLAGS}, 1125 .mh.callback = &umass_t_bbb_data_write_callback, 1126 .mh.timeout = 0, /* overwritten later */ 1127 }, 1128 1129 [UMASS_T_BBB_DATA_WR_CS] = { 1130 .type = UE_CONTROL, 1131 .endpoint = 0x00, /* Control pipe */ 1132 .direction = UE_DIR_ANY, 1133 .mh.bufsize = sizeof(struct usb2_device_request), |
1139 .mh.flags = {}, | |
1140 .mh.callback = &umass_t_bbb_data_wr_cs_callback, 1141 .mh.timeout = 5000, /* 5 seconds */ 1142 }, 1143 1144 [UMASS_T_BBB_STATUS] = { 1145 .type = UE_BULK, 1146 .endpoint = UE_ADDR_ANY, 1147 .direction = UE_DIR_IN, --- 7 unchanged lines hidden (view full) --- 1155struct usb2_config umass_cbi_config[UMASS_T_CBI_MAX] = { 1156 1157 [UMASS_T_CBI_RESET1] = { 1158 .type = UE_CONTROL, 1159 .endpoint = 0x00, /* Control pipe */ 1160 .direction = UE_DIR_ANY, 1161 .mh.bufsize = (sizeof(struct usb2_device_request) + 1162 UMASS_CBI_DIAGNOSTIC_CMDLEN), | 1134 .mh.callback = &umass_t_bbb_data_wr_cs_callback, 1135 .mh.timeout = 5000, /* 5 seconds */ 1136 }, 1137 1138 [UMASS_T_BBB_STATUS] = { 1139 .type = UE_BULK, 1140 .endpoint = UE_ADDR_ANY, 1141 .direction = UE_DIR_IN, --- 7 unchanged lines hidden (view full) --- 1149struct usb2_config umass_cbi_config[UMASS_T_CBI_MAX] = { 1150 1151 [UMASS_T_CBI_RESET1] = { 1152 .type = UE_CONTROL, 1153 .endpoint = 0x00, /* Control pipe */ 1154 .direction = UE_DIR_ANY, 1155 .mh.bufsize = (sizeof(struct usb2_device_request) + 1156 UMASS_CBI_DIAGNOSTIC_CMDLEN), |
1163 .mh.flags = {}, | |
1164 .mh.callback = &umass_t_cbi_reset1_callback, 1165 .mh.timeout = 5000, /* 5 seconds */ 1166 .mh.interval = 500, /* 500 milliseconds */ 1167 }, 1168 1169 [UMASS_T_CBI_RESET2] = { 1170 .type = UE_CONTROL, 1171 .endpoint = 0x00, /* Control pipe */ 1172 .direction = UE_DIR_ANY, 1173 .mh.bufsize = sizeof(struct usb2_device_request), | 1157 .mh.callback = &umass_t_cbi_reset1_callback, 1158 .mh.timeout = 5000, /* 5 seconds */ 1159 .mh.interval = 500, /* 500 milliseconds */ 1160 }, 1161 1162 [UMASS_T_CBI_RESET2] = { 1163 .type = UE_CONTROL, 1164 .endpoint = 0x00, /* Control pipe */ 1165 .direction = UE_DIR_ANY, 1166 .mh.bufsize = sizeof(struct usb2_device_request), |
1174 .mh.flags = {}, | |
1175 .mh.callback = &umass_t_cbi_reset2_callback, 1176 .mh.timeout = 5000, /* 5 seconds */ 1177 .mh.interval = 50, /* 50 milliseconds */ 1178 }, 1179 1180 [UMASS_T_CBI_RESET3] = { 1181 .type = UE_CONTROL, 1182 .endpoint = 0x00, /* Control pipe */ 1183 .direction = UE_DIR_ANY, 1184 .mh.bufsize = sizeof(struct usb2_device_request), | 1167 .mh.callback = &umass_t_cbi_reset2_callback, 1168 .mh.timeout = 5000, /* 5 seconds */ 1169 .mh.interval = 50, /* 50 milliseconds */ 1170 }, 1171 1172 [UMASS_T_CBI_RESET3] = { 1173 .type = UE_CONTROL, 1174 .endpoint = 0x00, /* Control pipe */ 1175 .direction = UE_DIR_ANY, 1176 .mh.bufsize = sizeof(struct usb2_device_request), |
1185 .mh.flags = {}, | |
1186 .mh.callback = &umass_t_cbi_reset3_callback, 1187 .mh.timeout = 5000, /* 5 seconds */ 1188 .mh.interval = 50, /* 50 milliseconds */ 1189 }, 1190 1191 [UMASS_T_CBI_COMMAND] = { 1192 .type = UE_CONTROL, 1193 .endpoint = 0x00, /* Control pipe */ 1194 .direction = UE_DIR_ANY, 1195 .mh.bufsize = (sizeof(struct usb2_device_request) + 1196 UMASS_MAX_CMDLEN), | 1177 .mh.callback = &umass_t_cbi_reset3_callback, 1178 .mh.timeout = 5000, /* 5 seconds */ 1179 .mh.interval = 50, /* 50 milliseconds */ 1180 }, 1181 1182 [UMASS_T_CBI_COMMAND] = { 1183 .type = UE_CONTROL, 1184 .endpoint = 0x00, /* Control pipe */ 1185 .direction = UE_DIR_ANY, 1186 .mh.bufsize = (sizeof(struct usb2_device_request) + 1187 UMASS_MAX_CMDLEN), |
1197 .mh.flags = {}, | |
1198 .mh.callback = &umass_t_cbi_command_callback, 1199 .mh.timeout = 5000, /* 5 seconds */ 1200 }, 1201 1202 [UMASS_T_CBI_DATA_READ] = { 1203 .type = UE_BULK, 1204 .endpoint = UE_ADDR_ANY, 1205 .direction = UE_DIR_IN, 1206 .mh.bufsize = UMASS_BULK_SIZE, 1207 .mh.flags = {.proxy_buffer = 1,.short_xfer_ok = 1, UMASS_USB_FLAGS}, 1208 .mh.callback = &umass_t_cbi_data_read_callback, 1209 .mh.timeout = 0, /* overwritten later */ 1210 }, 1211 1212 [UMASS_T_CBI_DATA_RD_CS] = { 1213 .type = UE_CONTROL, 1214 .endpoint = 0x00, /* Control pipe */ 1215 .direction = UE_DIR_ANY, 1216 .mh.bufsize = sizeof(struct usb2_device_request), | 1188 .mh.callback = &umass_t_cbi_command_callback, 1189 .mh.timeout = 5000, /* 5 seconds */ 1190 }, 1191 1192 [UMASS_T_CBI_DATA_READ] = { 1193 .type = UE_BULK, 1194 .endpoint = UE_ADDR_ANY, 1195 .direction = UE_DIR_IN, 1196 .mh.bufsize = UMASS_BULK_SIZE, 1197 .mh.flags = {.proxy_buffer = 1,.short_xfer_ok = 1, UMASS_USB_FLAGS}, 1198 .mh.callback = &umass_t_cbi_data_read_callback, 1199 .mh.timeout = 0, /* overwritten later */ 1200 }, 1201 1202 [UMASS_T_CBI_DATA_RD_CS] = { 1203 .type = UE_CONTROL, 1204 .endpoint = 0x00, /* Control pipe */ 1205 .direction = UE_DIR_ANY, 1206 .mh.bufsize = sizeof(struct usb2_device_request), |
1217 .mh.flags = {}, | |
1218 .mh.callback = &umass_t_cbi_data_rd_cs_callback, 1219 .mh.timeout = 5000, /* 5 seconds */ 1220 }, 1221 1222 [UMASS_T_CBI_DATA_WRITE] = { 1223 .type = UE_BULK, 1224 .endpoint = UE_ADDR_ANY, 1225 .direction = UE_DIR_OUT, 1226 .mh.bufsize = UMASS_BULK_SIZE, 1227 .mh.flags = {.proxy_buffer = 1,.short_xfer_ok = 1, UMASS_USB_FLAGS}, 1228 .mh.callback = &umass_t_cbi_data_write_callback, 1229 .mh.timeout = 0, /* overwritten later */ 1230 }, 1231 1232 [UMASS_T_CBI_DATA_WR_CS] = { 1233 .type = UE_CONTROL, 1234 .endpoint = 0x00, /* Control pipe */ 1235 .direction = UE_DIR_ANY, 1236 .mh.bufsize = sizeof(struct usb2_device_request), | 1207 .mh.callback = &umass_t_cbi_data_rd_cs_callback, 1208 .mh.timeout = 5000, /* 5 seconds */ 1209 }, 1210 1211 [UMASS_T_CBI_DATA_WRITE] = { 1212 .type = UE_BULK, 1213 .endpoint = UE_ADDR_ANY, 1214 .direction = UE_DIR_OUT, 1215 .mh.bufsize = UMASS_BULK_SIZE, 1216 .mh.flags = {.proxy_buffer = 1,.short_xfer_ok = 1, UMASS_USB_FLAGS}, 1217 .mh.callback = &umass_t_cbi_data_write_callback, 1218 .mh.timeout = 0, /* overwritten later */ 1219 }, 1220 1221 [UMASS_T_CBI_DATA_WR_CS] = { 1222 .type = UE_CONTROL, 1223 .endpoint = 0x00, /* Control pipe */ 1224 .direction = UE_DIR_ANY, 1225 .mh.bufsize = sizeof(struct usb2_device_request), |
1237 .mh.flags = {}, | |
1238 .mh.callback = &umass_t_cbi_data_wr_cs_callback, 1239 .mh.timeout = 5000, /* 5 seconds */ 1240 }, 1241 1242 [UMASS_T_CBI_STATUS] = { 1243 .type = UE_INTERRUPT, 1244 .endpoint = UE_ADDR_ANY, 1245 .direction = UE_DIR_IN, 1246 .mh.flags = {.short_xfer_ok = 1,}, 1247 .mh.bufsize = sizeof(umass_cbi_sbl_t), 1248 .mh.callback = &umass_t_cbi_status_callback, 1249 .mh.timeout = 5000, /* ms */ 1250 }, 1251 1252 [UMASS_T_CBI_RESET4] = { 1253 .type = UE_CONTROL, 1254 .endpoint = 0x00, /* Control pipe */ 1255 .direction = UE_DIR_ANY, 1256 .mh.bufsize = sizeof(struct usb2_device_request), | 1226 .mh.callback = &umass_t_cbi_data_wr_cs_callback, 1227 .mh.timeout = 5000, /* 5 seconds */ 1228 }, 1229 1230 [UMASS_T_CBI_STATUS] = { 1231 .type = UE_INTERRUPT, 1232 .endpoint = UE_ADDR_ANY, 1233 .direction = UE_DIR_IN, 1234 .mh.flags = {.short_xfer_ok = 1,}, 1235 .mh.bufsize = sizeof(umass_cbi_sbl_t), 1236 .mh.callback = &umass_t_cbi_status_callback, 1237 .mh.timeout = 5000, /* ms */ 1238 }, 1239 1240 [UMASS_T_CBI_RESET4] = { 1241 .type = UE_CONTROL, 1242 .endpoint = 0x00, /* Control pipe */ 1243 .direction = UE_DIR_ANY, 1244 .mh.bufsize = sizeof(struct usb2_device_request), |
1257 .mh.flags = {}, | |
1258 .mh.callback = &umass_t_cbi_reset4_callback, 1259 .mh.timeout = 5000, /* ms */ 1260 }, 1261}; 1262 1263/* If device cannot return valid inquiry data, fake it */ 1264static const uint8_t fake_inq_data[SHORT_INQUIRY_LENGTH] = { 1265 0, /* removable */ 0x80, SCSI_REV_2, SCSI_REV_2, --- 2358 unchanged lines hidden --- | 1245 .mh.callback = &umass_t_cbi_reset4_callback, 1246 .mh.timeout = 5000, /* ms */ 1247 }, 1248}; 1249 1250/* If device cannot return valid inquiry data, fake it */ 1251static const uint8_t fake_inq_data[SHORT_INQUIRY_LENGTH] = { 1252 0, /* removable */ 0x80, SCSI_REV_2, SCSI_REV_2, --- 2358 unchanged lines hidden --- |