Lines Matching refs:disc

51 static void fc_disc_stop_rports(struct fc_disc *disc)  in fc_disc_stop_rports()  argument
55 lockdep_assert_held(&disc->disc_mutex); in fc_disc_stop_rports()
57 list_for_each_entry(rdata, &disc->rports, peers) { in fc_disc_stop_rports()
70 static void fc_disc_recv_rscn_req(struct fc_disc *disc, struct fc_frame *fp) in fc_disc_recv_rscn_req() argument
83 lockdep_assert_held(&disc->disc_mutex); in fc_disc_recv_rscn_req()
85 lport = fc_disc_lport(disc); in fc_disc_recv_rscn_req()
87 FC_DISC_DBG(disc, "Received an RSCN event\n"); in fc_disc_recv_rscn_req()
120 FC_DISC_DBG(disc, "Port address format for port " in fc_disc_recv_rscn_req()
135 FC_DISC_DBG(disc, "Address format is (%d)\n", fmt); in fc_disc_recv_rscn_req()
155 FC_DISC_DBG(disc, "RSCN received: rediscovering\n"); in fc_disc_recv_rscn_req()
156 fc_disc_restart(disc); in fc_disc_recv_rscn_req()
158 FC_DISC_DBG(disc, "RSCN received: not rediscovering. " in fc_disc_recv_rscn_req()
160 redisc, lport->state, disc->pending); in fc_disc_recv_rscn_req()
165 FC_DISC_DBG(disc, "Received a bad RSCN frame\n"); in fc_disc_recv_rscn_req()
184 struct fc_disc *disc = &lport->disc; in fc_disc_recv_req() local
189 mutex_lock(&disc->disc_mutex); in fc_disc_recv_req()
190 fc_disc_recv_rscn_req(disc, fp); in fc_disc_recv_req()
191 mutex_unlock(&disc->disc_mutex); in fc_disc_recv_req()
194 FC_DISC_DBG(disc, "Received an unsupported request, " in fc_disc_recv_req()
205 static void fc_disc_restart(struct fc_disc *disc) in fc_disc_restart() argument
207 lockdep_assert_held(&disc->disc_mutex); in fc_disc_restart()
209 if (!disc->disc_callback) in fc_disc_restart()
212 FC_DISC_DBG(disc, "Restarting discovery\n"); in fc_disc_restart()
214 disc->requested = 1; in fc_disc_restart()
215 if (disc->pending) in fc_disc_restart()
223 disc->disc_id = (disc->disc_id + 2) | 1; in fc_disc_restart()
224 disc->retry_count = 0; in fc_disc_restart()
225 fc_disc_gpn_ft_req(disc); in fc_disc_restart()
237 struct fc_disc *disc = &lport->disc; in fc_disc_start() local
244 mutex_lock(&disc->disc_mutex); in fc_disc_start()
245 disc->disc_callback = disc_callback; in fc_disc_start()
246 fc_disc_restart(disc); in fc_disc_start()
247 mutex_unlock(&disc->disc_mutex); in fc_disc_start()
255 static void fc_disc_done(struct fc_disc *disc, enum fc_disc_event event) in fc_disc_done() argument
257 struct fc_lport *lport = fc_disc_lport(disc); in fc_disc_done()
260 lockdep_assert_held(&disc->disc_mutex); in fc_disc_done()
261 FC_DISC_DBG(disc, "Discovery complete\n"); in fc_disc_done()
263 disc->pending = 0; in fc_disc_done()
264 if (disc->requested) { in fc_disc_done()
265 fc_disc_restart(disc); in fc_disc_done()
278 list_for_each_entry(rdata, &disc->rports, peers) { in fc_disc_done()
282 if (rdata->disc_id == disc->disc_id) in fc_disc_done()
289 mutex_unlock(&disc->disc_mutex); in fc_disc_done()
290 disc->disc_callback(lport, event); in fc_disc_done()
291 mutex_lock(&disc->disc_mutex); in fc_disc_done()
299 static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp) in fc_disc_error() argument
301 struct fc_lport *lport = fc_disc_lport(disc); in fc_disc_error()
304 FC_DISC_DBG(disc, "Error %d, retries %d/%d\n", in fc_disc_error()
305 PTR_ERR_OR_ZERO(fp), disc->retry_count, in fc_disc_error()
313 if (disc->retry_count < FC_DISC_RETRY_LIMIT) { in fc_disc_error()
321 if (!disc->retry_count) in fc_disc_error()
324 disc->retry_count++; in fc_disc_error()
325 schedule_delayed_work(&disc->disc_work, delay); in fc_disc_error()
327 fc_disc_done(disc, DISC_EV_FAILED); in fc_disc_error()
334 disc->pending = 0; in fc_disc_error()
342 static void fc_disc_gpn_ft_req(struct fc_disc *disc) in fc_disc_gpn_ft_req() argument
345 struct fc_lport *lport = fc_disc_lport(disc); in fc_disc_gpn_ft_req()
347 lockdep_assert_held(&disc->disc_mutex); in fc_disc_gpn_ft_req()
351 disc->pending = 1; in fc_disc_gpn_ft_req()
352 disc->requested = 0; in fc_disc_gpn_ft_req()
354 disc->buf_len = 0; in fc_disc_gpn_ft_req()
355 disc->seq_count = 0; in fc_disc_gpn_ft_req()
365 disc, 3 * lport->r_a_tov)) in fc_disc_gpn_ft_req()
368 fc_disc_error(disc, NULL); in fc_disc_gpn_ft_req()
379 static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len) in fc_disc_gpn_ft_parse() argument
390 lport = fc_disc_lport(disc); in fc_disc_gpn_ft_parse()
391 disc->seq_count++; in fc_disc_gpn_ft_parse()
399 tlen = disc->buf_len; in fc_disc_gpn_ft_parse()
400 disc->buf_len = 0; in fc_disc_gpn_ft_parse()
408 np = &disc->partial_buf; in fc_disc_gpn_ft_parse()
418 disc->buf_len = (unsigned char) plen; in fc_disc_gpn_ft_parse()
420 disc->buf_len = 0; in fc_disc_gpn_ft_parse()
439 rdata->disc_id = disc->disc_id; in fc_disc_gpn_ft_parse()
449 fc_disc_done(disc, DISC_EV_SUCCESS); in fc_disc_gpn_ft_parse()
463 if (np != &disc->partial_buf) { in fc_disc_gpn_ft_parse()
464 FC_DISC_DBG(disc, "Partial buffer remains " in fc_disc_gpn_ft_parse()
466 memcpy(&disc->partial_buf, np, len); in fc_disc_gpn_ft_parse()
468 disc->buf_len = (unsigned char) len; in fc_disc_gpn_ft_parse()
479 struct fc_disc *disc = container_of(work, in fc_disc_timeout() local
482 mutex_lock(&disc->disc_mutex); in fc_disc_timeout()
483 fc_disc_gpn_ft_req(disc); in fc_disc_timeout()
484 mutex_unlock(&disc->disc_mutex); in fc_disc_timeout()
499 struct fc_disc *disc = disc_arg; in fc_disc_gpn_ft_resp() local
507 mutex_lock(&disc->disc_mutex); in fc_disc_gpn_ft_resp()
508 FC_DISC_DBG(disc, "Received a GPN_FT response\n"); in fc_disc_gpn_ft_resp()
511 fc_disc_error(disc, fp); in fc_disc_gpn_ft_resp()
512 mutex_unlock(&disc->disc_mutex); in fc_disc_gpn_ft_resp()
520 if (fr_sof(fp) == FC_SOF_I3 && seq_cnt == 0 && disc->seq_count == 0) { in fc_disc_gpn_ft_resp()
523 FC_DISC_DBG(disc, "GPN_FT response too short, len %d\n", in fc_disc_gpn_ft_resp()
530 error = fc_disc_gpn_ft_parse(disc, cp + 1, len); in fc_disc_gpn_ft_resp()
532 FC_DISC_DBG(disc, "GPN_FT rejected reason %x exp %x " in fc_disc_gpn_ft_resp()
540 FC_DISC_DBG(disc, "GPN_FT unexpected response code " in fc_disc_gpn_ft_resp()
544 } else if (fr_sof(fp) == FC_SOF_N3 && seq_cnt == disc->seq_count) { in fc_disc_gpn_ft_resp()
545 error = fc_disc_gpn_ft_parse(disc, fh + 1, len); in fc_disc_gpn_ft_resp()
547 FC_DISC_DBG(disc, "GPN_FT unexpected frame - out of sequence? " in fc_disc_gpn_ft_resp()
549 seq_cnt, disc->seq_count, fr_sof(fp), fr_eof(fp)); in fc_disc_gpn_ft_resp()
553 fc_disc_error(disc, ERR_PTR(error)); in fc_disc_gpn_ft_resp()
555 fc_disc_done(disc, event); in fc_disc_gpn_ft_resp()
557 mutex_unlock(&disc->disc_mutex); in fc_disc_gpn_ft_resp()
574 struct fc_disc *disc; in fc_disc_gpn_id_resp() local
580 disc = &lport->disc; in fc_disc_gpn_id_resp()
585 mutex_lock(&disc->disc_mutex); in fc_disc_gpn_id_resp()
586 fc_disc_restart(disc); in fc_disc_gpn_id_resp()
587 mutex_unlock(&disc->disc_mutex); in fc_disc_gpn_id_resp()
604 FC_DISC_DBG(disc, "GPN_ID accepted. WWPN changed. " in fc_disc_gpn_id_resp()
609 mutex_lock(&lport->disc.disc_mutex); in fc_disc_gpn_id_resp()
611 mutex_unlock(&lport->disc.disc_mutex); in fc_disc_gpn_id_resp()
613 new_rdata->disc_id = disc->disc_id; in fc_disc_gpn_id_resp()
618 rdata->disc_id = disc->disc_id; in fc_disc_gpn_id_resp()
622 FC_DISC_DBG(disc, "GPN_ID rejected reason %x exp %x\n", in fc_disc_gpn_id_resp()
626 FC_DISC_DBG(disc, "GPN_ID unexpected response code %x\n", in fc_disc_gpn_id_resp()
629 mutex_lock(&disc->disc_mutex); in fc_disc_gpn_id_resp()
630 fc_disc_restart(disc); in fc_disc_gpn_id_resp()
631 mutex_unlock(&disc->disc_mutex); in fc_disc_gpn_id_resp()
651 lockdep_assert_held(&lport->disc.disc_mutex); in fc_disc_gpn_id_req()
673 lockdep_assert_held(&lport->disc.disc_mutex); in fc_disc_single()
688 struct fc_disc *disc = &lport->disc; in fc_disc_stop() local
690 if (disc->pending) in fc_disc_stop()
691 cancel_delayed_work_sync(&disc->disc_work); in fc_disc_stop()
692 mutex_lock(&disc->disc_mutex); in fc_disc_stop()
693 fc_disc_stop_rports(disc); in fc_disc_stop()
694 mutex_unlock(&disc->disc_mutex); in fc_disc_stop()
717 struct fc_disc *disc; in fc_disc_config() local
731 disc = &lport->disc; in fc_disc_config()
733 disc->priv = priv; in fc_disc_config()
743 struct fc_disc *disc = &lport->disc; in fc_disc_init() local
745 INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout); in fc_disc_init()
746 mutex_init(&disc->disc_mutex); in fc_disc_init()
747 INIT_LIST_HEAD(&disc->rports); in fc_disc_init()