diff options
author | Chris Leech <christopher.leech@intel.com> | 2009-11-03 14:47:12 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:01:04 -0500 |
commit | c914f7d16df6420cfd4c09399957425ba9c21f47 (patch) | |
tree | 1b0abcc574a1ee55fefd8905f22b9c9449ee9272 /drivers/scsi | |
parent | 7cccc157119be9b3f57e03a5ae197ba0a6a8a89f (diff) |
[SCSI] libfc: combine name server registration request functions
Signed-off-by: Chris Leech <christopher.leech@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/libfc/fc_lport.c | 164 |
1 files changed, 42 insertions, 122 deletions
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c index f67ca680eb63..dfea6c572dfb 100644 --- a/drivers/scsi/libfc/fc_lport.c +++ b/drivers/scsi/libfc/fc_lport.c | |||
@@ -108,10 +108,7 @@ static void fc_lport_error(struct fc_lport *, struct fc_frame *); | |||
108 | static void fc_lport_enter_reset(struct fc_lport *); | 108 | static void fc_lport_enter_reset(struct fc_lport *); |
109 | static void fc_lport_enter_flogi(struct fc_lport *); | 109 | static void fc_lport_enter_flogi(struct fc_lport *); |
110 | static void fc_lport_enter_dns(struct fc_lport *); | 110 | static void fc_lport_enter_dns(struct fc_lport *); |
111 | static void fc_lport_enter_rnn_id(struct fc_lport *); | 111 | static void fc_lport_enter_ns(struct fc_lport *, enum fc_lport_state); |
112 | static void fc_lport_enter_rsnn_nn(struct fc_lport *); | ||
113 | static void fc_lport_enter_rspn_id(struct fc_lport *); | ||
114 | static void fc_lport_enter_rft_id(struct fc_lport *); | ||
115 | static void fc_lport_enter_scr(struct fc_lport *); | 112 | static void fc_lport_enter_scr(struct fc_lport *); |
116 | static void fc_lport_enter_ready(struct fc_lport *); | 113 | static void fc_lport_enter_ready(struct fc_lport *); |
117 | static void fc_lport_enter_logo(struct fc_lport *); | 114 | static void fc_lport_enter_logo(struct fc_lport *); |
@@ -157,7 +154,7 @@ static void fc_lport_rport_callback(struct fc_lport *lport, | |||
157 | case RPORT_EV_READY: | 154 | case RPORT_EV_READY: |
158 | if (lport->state == LPORT_ST_DNS) { | 155 | if (lport->state == LPORT_ST_DNS) { |
159 | lport->dns_rp = rdata; | 156 | lport->dns_rp = rdata; |
160 | fc_lport_enter_rnn_id(lport); | 157 | fc_lport_enter_ns(lport, LPORT_ST_RNN_ID); |
161 | } else { | 158 | } else { |
162 | FC_LPORT_DBG(lport, "Received an READY event " | 159 | FC_LPORT_DBG(lport, "Received an READY event " |
163 | "on port (%6x) for the directory " | 160 | "on port (%6x) for the directory " |
@@ -1031,13 +1028,13 @@ static void fc_lport_ns_resp(struct fc_seq *sp, struct fc_frame *fp, | |||
1031 | ntohs(ct->ct_cmd) == FC_FS_ACC) | 1028 | ntohs(ct->ct_cmd) == FC_FS_ACC) |
1032 | switch (lport->state) { | 1029 | switch (lport->state) { |
1033 | case LPORT_ST_RNN_ID: | 1030 | case LPORT_ST_RNN_ID: |
1034 | fc_lport_enter_rsnn_nn(lport); | 1031 | fc_lport_enter_ns(lport, LPORT_ST_RSNN_NN); |
1035 | break; | 1032 | break; |
1036 | case LPORT_ST_RSNN_NN: | 1033 | case LPORT_ST_RSNN_NN: |
1037 | fc_lport_enter_rspn_id(lport); | 1034 | fc_lport_enter_ns(lport, LPORT_ST_RSPN_ID); |
1038 | break; | 1035 | break; |
1039 | case LPORT_ST_RSPN_ID: | 1036 | case LPORT_ST_RSPN_ID: |
1040 | fc_lport_enter_rft_id(lport); | 1037 | fc_lport_enter_ns(lport, LPORT_ST_RFT_ID); |
1041 | break; | 1038 | break; |
1042 | case LPORT_ST_RFT_ID: | 1039 | case LPORT_ST_RFT_ID: |
1043 | fc_lport_enter_scr(lport); | 1040 | fc_lport_enter_scr(lport); |
@@ -1130,133 +1127,62 @@ static void fc_lport_enter_scr(struct fc_lport *lport) | |||
1130 | } | 1127 | } |
1131 | 1128 | ||
1132 | /** | 1129 | /** |
1133 | * fc_lport_enter_rft_id() - Register FC4-types with the name server | 1130 | * fc_lport_enter_ns() - register some object with the name server |
1134 | * @lport: Fibre Channel local port to register | 1131 | * @lport: Fibre Channel local port to register |
1135 | * | 1132 | * |
1136 | * Locking Note: The lport lock is expected to be held before calling | 1133 | * Locking Note: The lport lock is expected to be held before calling |
1137 | * this routine. | 1134 | * this routine. |
1138 | */ | 1135 | */ |
1139 | static void fc_lport_enter_rft_id(struct fc_lport *lport) | 1136 | static void fc_lport_enter_ns(struct fc_lport *lport, enum fc_lport_state state) |
1140 | { | ||
1141 | struct fc_frame *fp; | ||
1142 | struct fc_ns_fts *lps; | ||
1143 | int i; | ||
1144 | |||
1145 | FC_LPORT_DBG(lport, "Entered RFT_ID state from %s state\n", | ||
1146 | fc_lport_state(lport)); | ||
1147 | |||
1148 | fc_lport_state_enter(lport, LPORT_ST_RFT_ID); | ||
1149 | |||
1150 | lps = &lport->fcts; | ||
1151 | i = sizeof(lps->ff_type_map) / sizeof(lps->ff_type_map[0]); | ||
1152 | while (--i >= 0) | ||
1153 | if (ntohl(lps->ff_type_map[i]) != 0) | ||
1154 | break; | ||
1155 | if (i < 0) { | ||
1156 | /* nothing to register, move on to SCR */ | ||
1157 | fc_lport_enter_scr(lport); | ||
1158 | return; | ||
1159 | } | ||
1160 | |||
1161 | fp = fc_frame_alloc(lport, sizeof(struct fc_ct_hdr) + | ||
1162 | sizeof(struct fc_ns_rft)); | ||
1163 | if (!fp) { | ||
1164 | fc_lport_error(lport, fp); | ||
1165 | return; | ||
1166 | } | ||
1167 | |||
1168 | if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, FC_NS_RFT_ID, | ||
1169 | fc_lport_ns_resp, | ||
1170 | lport, lport->e_d_tov)) | ||
1171 | fc_lport_error(lport, fp); | ||
1172 | } | ||
1173 | |||
1174 | /** | ||
1175 | * fc_rport_enter_rspn_id() - Register symbolic port name with the name server | ||
1176 | * @lport: Fibre Channel local port to register | ||
1177 | * | ||
1178 | * Locking Note: The lport lock is expected to be held before calling | ||
1179 | * this routine. | ||
1180 | */ | ||
1181 | static void fc_lport_enter_rspn_id(struct fc_lport *lport) | ||
1182 | { | 1137 | { |
1183 | struct fc_frame *fp; | 1138 | struct fc_frame *fp; |
1139 | enum fc_ns_req cmd; | ||
1140 | int size = sizeof(struct fc_ct_hdr); | ||
1184 | size_t len; | 1141 | size_t len; |
1185 | 1142 | ||
1186 | FC_LPORT_DBG(lport, "Entered RSPN_ID state from %s state\n", | 1143 | FC_LPORT_DBG(lport, "Entered %s state from %s state\n", |
1144 | fc_lport_state_names[state], | ||
1187 | fc_lport_state(lport)); | 1145 | fc_lport_state(lport)); |
1188 | 1146 | ||
1189 | fc_lport_state_enter(lport, LPORT_ST_RSPN_ID); | 1147 | fc_lport_state_enter(lport, state); |
1190 | |||
1191 | len = strnlen(fc_host_symbolic_name(lport->host), 255); | ||
1192 | fp = fc_frame_alloc(lport, sizeof(struct fc_ct_hdr) + | ||
1193 | sizeof(struct fc_ns_rspn) + len); | ||
1194 | if (!fp) { | ||
1195 | fc_lport_error(lport, fp); | ||
1196 | return; | ||
1197 | } | ||
1198 | |||
1199 | if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, FC_NS_RSPN_ID, | ||
1200 | fc_lport_ns_resp, | ||
1201 | lport, lport->e_d_tov)) | ||
1202 | fc_lport_error(lport, fp); | ||
1203 | } | ||
1204 | 1148 | ||
1205 | /** | 1149 | switch (state) { |
1206 | * fc_rport_enter_rsnn_nn() - Register symbolic node name with the name server | 1150 | case LPORT_ST_RNN_ID: |
1207 | * @lport: Fibre Channel local port to register | 1151 | cmd = FC_NS_RNN_ID; |
1208 | * | 1152 | size += sizeof(struct fc_ns_rn_id); |
1209 | * Locking Note: The lport lock is expected to be held before calling | 1153 | break; |
1210 | * this routine. | 1154 | case LPORT_ST_RSNN_NN: |
1211 | */ | 1155 | len = strnlen(fc_host_symbolic_name(lport->host), 255); |
1212 | static void fc_lport_enter_rsnn_nn(struct fc_lport *lport) | 1156 | /* if there is no symbolic name, skip to RFT_ID */ |
1213 | { | 1157 | if (!len) |
1214 | struct fc_frame *fp; | 1158 | return fc_lport_enter_ns(lport, LPORT_ST_RFT_ID); |
1215 | size_t len; | 1159 | cmd = FC_NS_RSNN_NN; |
1216 | 1160 | size += sizeof(struct fc_ns_rsnn) + len; | |
1217 | FC_LPORT_DBG(lport, "Entered RSNN_NN state from %s state\n", | 1161 | break; |
1218 | fc_lport_state(lport)); | 1162 | case LPORT_ST_RSPN_ID: |
1219 | 1163 | len = strnlen(fc_host_symbolic_name(lport->host), 255); | |
1220 | fc_lport_state_enter(lport, LPORT_ST_RSNN_NN); | 1164 | /* if there is no symbolic name, skip to RFT_ID */ |
1221 | 1165 | if (!len) | |
1222 | len = strnlen(fc_host_symbolic_name(lport->host), 255); | 1166 | return fc_lport_enter_ns(lport, LPORT_ST_RFT_ID); |
1223 | fp = fc_frame_alloc(lport, sizeof(struct fc_ct_hdr) + | 1167 | cmd = FC_NS_RSPN_ID; |
1224 | sizeof(struct fc_ns_rsnn) + len); | 1168 | size += sizeof(struct fc_ns_rspn) + len; |
1225 | if (!fp) { | 1169 | break; |
1226 | fc_lport_error(lport, fp); | 1170 | case LPORT_ST_RFT_ID: |
1171 | cmd = FC_NS_RFT_ID; | ||
1172 | size += sizeof(struct fc_ns_rft); | ||
1173 | break; | ||
1174 | default: | ||
1175 | fc_lport_error(lport, NULL); | ||
1227 | return; | 1176 | return; |
1228 | } | 1177 | } |
1229 | 1178 | ||
1230 | if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, FC_NS_RSNN_NN, | 1179 | fp = fc_frame_alloc(lport, size); |
1231 | fc_lport_ns_resp, | ||
1232 | lport, lport->e_d_tov)) | ||
1233 | fc_lport_error(lport, fp); | ||
1234 | } | ||
1235 | |||
1236 | /** | ||
1237 | * fc_rport_enter_rnn_id() - Register node name with the name server | ||
1238 | * @lport: Fibre Channel local port to register | ||
1239 | * | ||
1240 | * Locking Note: The lport lock is expected to be held before calling | ||
1241 | * this routine. | ||
1242 | */ | ||
1243 | static void fc_lport_enter_rnn_id(struct fc_lport *lport) | ||
1244 | { | ||
1245 | struct fc_frame *fp; | ||
1246 | |||
1247 | FC_LPORT_DBG(lport, "Entered RNN_ID state from %s state\n", | ||
1248 | fc_lport_state(lport)); | ||
1249 | |||
1250 | fc_lport_state_enter(lport, LPORT_ST_RNN_ID); | ||
1251 | |||
1252 | fp = fc_frame_alloc(lport, sizeof(struct fc_ct_hdr) + | ||
1253 | sizeof(struct fc_ns_rn_id)); | ||
1254 | if (!fp) { | 1180 | if (!fp) { |
1255 | fc_lport_error(lport, fp); | 1181 | fc_lport_error(lport, fp); |
1256 | return; | 1182 | return; |
1257 | } | 1183 | } |
1258 | 1184 | ||
1259 | if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, FC_NS_RNN_ID, | 1185 | if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, cmd, |
1260 | fc_lport_ns_resp, | 1186 | fc_lport_ns_resp, |
1261 | lport, lport->e_d_tov)) | 1187 | lport, lport->e_d_tov)) |
1262 | fc_lport_error(lport, fp); | 1188 | fc_lport_error(lport, fp); |
@@ -1324,16 +1250,10 @@ static void fc_lport_timeout(struct work_struct *work) | |||
1324 | fc_lport_enter_dns(lport); | 1250 | fc_lport_enter_dns(lport); |
1325 | break; | 1251 | break; |
1326 | case LPORT_ST_RNN_ID: | 1252 | case LPORT_ST_RNN_ID: |
1327 | fc_lport_enter_rnn_id(lport); | ||
1328 | break; | ||
1329 | case LPORT_ST_RSNN_NN: | 1253 | case LPORT_ST_RSNN_NN: |
1330 | fc_lport_enter_rsnn_nn(lport); | ||
1331 | break; | ||
1332 | case LPORT_ST_RSPN_ID: | 1254 | case LPORT_ST_RSPN_ID: |
1333 | fc_lport_enter_rspn_id(lport); | ||
1334 | break; | ||
1335 | case LPORT_ST_RFT_ID: | 1255 | case LPORT_ST_RFT_ID: |
1336 | fc_lport_enter_rft_id(lport); | 1256 | fc_lport_enter_ns(lport, lport->state); |
1337 | break; | 1257 | break; |
1338 | case LPORT_ST_SCR: | 1258 | case LPORT_ST_SCR: |
1339 | fc_lport_enter_scr(lport); | 1259 | fc_lport_enter_scr(lport); |