Deleted Added
full compact
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 ---