Lines Matching refs:disc

64 static void fc_disc_stop_rports(struct fc_disc *disc)  in fc_disc_stop_rports()  argument
69 lport = fc_disc_lport(disc); in fc_disc_stop_rports()
71 mutex_lock(&disc->disc_mutex); in fc_disc_stop_rports()
72 list_for_each_entry_rcu(rdata, &disc->rports, peers) in fc_disc_stop_rports()
74 mutex_unlock(&disc->disc_mutex); in fc_disc_stop_rports()
85 static void fc_disc_recv_rscn_req(struct fc_disc *disc, struct fc_frame *fp) in fc_disc_recv_rscn_req() argument
98 lport = fc_disc_lport(disc); in fc_disc_recv_rscn_req()
100 FC_DISC_DBG(disc, "Received an RSCN event\n"); in fc_disc_recv_rscn_req()
133 FC_DISC_DBG(disc, "Port address format for port " in fc_disc_recv_rscn_req()
148 FC_DISC_DBG(disc, "Address format is (%d)\n", fmt); in fc_disc_recv_rscn_req()
168 FC_DISC_DBG(disc, "RSCN received: rediscovering\n"); in fc_disc_recv_rscn_req()
169 fc_disc_restart(disc); in fc_disc_recv_rscn_req()
171 FC_DISC_DBG(disc, "RSCN received: not rediscovering. " in fc_disc_recv_rscn_req()
173 redisc, lport->state, disc->pending); in fc_disc_recv_rscn_req()
178 FC_DISC_DBG(disc, "Received a bad RSCN frame\n"); in fc_disc_recv_rscn_req()
197 struct fc_disc *disc = &lport->disc; in fc_disc_recv_req() local
202 mutex_lock(&disc->disc_mutex); in fc_disc_recv_req()
203 fc_disc_recv_rscn_req(disc, fp); in fc_disc_recv_req()
204 mutex_unlock(&disc->disc_mutex); in fc_disc_recv_req()
207 FC_DISC_DBG(disc, "Received an unsupported request, " in fc_disc_recv_req()
221 static void fc_disc_restart(struct fc_disc *disc) in fc_disc_restart() argument
223 if (!disc->disc_callback) in fc_disc_restart()
226 FC_DISC_DBG(disc, "Restarting discovery\n"); in fc_disc_restart()
228 disc->requested = 1; in fc_disc_restart()
229 if (disc->pending) in fc_disc_restart()
237 disc->disc_id = (disc->disc_id + 2) | 1; in fc_disc_restart()
238 disc->retry_count = 0; in fc_disc_restart()
239 fc_disc_gpn_ft_req(disc); in fc_disc_restart()
251 struct fc_disc *disc = &lport->disc; in fc_disc_start() local
258 mutex_lock(&disc->disc_mutex); in fc_disc_start()
259 disc->disc_callback = disc_callback; in fc_disc_start()
260 fc_disc_restart(disc); in fc_disc_start()
261 mutex_unlock(&disc->disc_mutex); in fc_disc_start()
273 static void fc_disc_done(struct fc_disc *disc, enum fc_disc_event event) in fc_disc_done() argument
275 struct fc_lport *lport = fc_disc_lport(disc); in fc_disc_done()
278 FC_DISC_DBG(disc, "Discovery complete\n"); in fc_disc_done()
280 disc->pending = 0; in fc_disc_done()
281 if (disc->requested) { in fc_disc_done()
282 fc_disc_restart(disc); in fc_disc_done()
292 list_for_each_entry_rcu(rdata, &disc->rports, peers) { in fc_disc_done()
295 if (rdata->disc_id == disc->disc_id) in fc_disc_done()
301 mutex_unlock(&disc->disc_mutex); in fc_disc_done()
302 disc->disc_callback(lport, event); in fc_disc_done()
303 mutex_lock(&disc->disc_mutex); in fc_disc_done()
311 static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp) in fc_disc_error() argument
313 struct fc_lport *lport = fc_disc_lport(disc); in fc_disc_error()
316 FC_DISC_DBG(disc, "Error %ld, retries %d/%d\n", in fc_disc_error()
317 PTR_ERR(fp), disc->retry_count, in fc_disc_error()
325 if (disc->retry_count < FC_DISC_RETRY_LIMIT) { in fc_disc_error()
333 if (!disc->retry_count) in fc_disc_error()
336 disc->retry_count++; in fc_disc_error()
337 schedule_delayed_work(&disc->disc_work, delay); in fc_disc_error()
339 fc_disc_done(disc, DISC_EV_FAILED); in fc_disc_error()
346 disc->pending = 0; in fc_disc_error()
357 static void fc_disc_gpn_ft_req(struct fc_disc *disc) in fc_disc_gpn_ft_req() argument
360 struct fc_lport *lport = fc_disc_lport(disc); in fc_disc_gpn_ft_req()
364 disc->pending = 1; in fc_disc_gpn_ft_req()
365 disc->requested = 0; in fc_disc_gpn_ft_req()
367 disc->buf_len = 0; in fc_disc_gpn_ft_req()
368 disc->seq_count = 0; in fc_disc_gpn_ft_req()
378 disc, 3 * lport->r_a_tov)) in fc_disc_gpn_ft_req()
381 fc_disc_error(disc, NULL); in fc_disc_gpn_ft_req()
392 static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len) in fc_disc_gpn_ft_parse() argument
403 lport = fc_disc_lport(disc); in fc_disc_gpn_ft_parse()
404 disc->seq_count++; in fc_disc_gpn_ft_parse()
412 tlen = disc->buf_len; in fc_disc_gpn_ft_parse()
413 disc->buf_len = 0; in fc_disc_gpn_ft_parse()
421 np = &disc->partial_buf; in fc_disc_gpn_ft_parse()
431 disc->buf_len = (unsigned char) plen; in fc_disc_gpn_ft_parse()
433 disc->buf_len = 0; in fc_disc_gpn_ft_parse()
452 rdata->disc_id = disc->disc_id; in fc_disc_gpn_ft_parse()
462 fc_disc_done(disc, DISC_EV_SUCCESS); in fc_disc_gpn_ft_parse()
476 if (np != &disc->partial_buf) { in fc_disc_gpn_ft_parse()
477 FC_DISC_DBG(disc, "Partial buffer remains " in fc_disc_gpn_ft_parse()
479 memcpy(&disc->partial_buf, np, len); in fc_disc_gpn_ft_parse()
481 disc->buf_len = (unsigned char) len; in fc_disc_gpn_ft_parse()
492 struct fc_disc *disc = container_of(work, in fc_disc_timeout() local
495 mutex_lock(&disc->disc_mutex); in fc_disc_timeout()
496 fc_disc_gpn_ft_req(disc); in fc_disc_timeout()
497 mutex_unlock(&disc->disc_mutex); in fc_disc_timeout()
512 struct fc_disc *disc = disc_arg; in fc_disc_gpn_ft_resp() local
520 mutex_lock(&disc->disc_mutex); in fc_disc_gpn_ft_resp()
521 FC_DISC_DBG(disc, "Received a GPN_FT response\n"); in fc_disc_gpn_ft_resp()
524 fc_disc_error(disc, fp); in fc_disc_gpn_ft_resp()
525 mutex_unlock(&disc->disc_mutex); in fc_disc_gpn_ft_resp()
533 if (fr_sof(fp) == FC_SOF_I3 && seq_cnt == 0 && disc->seq_count == 0) { in fc_disc_gpn_ft_resp()
536 FC_DISC_DBG(disc, "GPN_FT response too short, len %d\n", in fc_disc_gpn_ft_resp()
543 error = fc_disc_gpn_ft_parse(disc, cp + 1, len); in fc_disc_gpn_ft_resp()
545 FC_DISC_DBG(disc, "GPN_FT rejected reason %x exp %x " in fc_disc_gpn_ft_resp()
553 FC_DISC_DBG(disc, "GPN_FT unexpected response code " in fc_disc_gpn_ft_resp()
557 } else if (fr_sof(fp) == FC_SOF_N3 && seq_cnt == disc->seq_count) { in fc_disc_gpn_ft_resp()
558 error = fc_disc_gpn_ft_parse(disc, fh + 1, len); in fc_disc_gpn_ft_resp()
560 FC_DISC_DBG(disc, "GPN_FT unexpected frame - out of sequence? " in fc_disc_gpn_ft_resp()
562 seq_cnt, disc->seq_count, fr_sof(fp), fr_eof(fp)); in fc_disc_gpn_ft_resp()
566 fc_disc_error(disc, fp); in fc_disc_gpn_ft_resp()
568 fc_disc_done(disc, event); in fc_disc_gpn_ft_resp()
570 mutex_unlock(&disc->disc_mutex); in fc_disc_gpn_ft_resp()
587 struct fc_disc *disc; in fc_disc_gpn_id_resp() local
593 disc = &lport->disc; in fc_disc_gpn_id_resp()
595 mutex_lock(&disc->disc_mutex); in fc_disc_gpn_id_resp()
613 FC_DISC_DBG(disc, "GPN_ID accepted. WWPN changed. " in fc_disc_gpn_id_resp()
621 new_rdata->disc_id = disc->disc_id; in fc_disc_gpn_id_resp()
626 rdata->disc_id = disc->disc_id; in fc_disc_gpn_id_resp()
629 FC_DISC_DBG(disc, "GPN_ID rejected reason %x exp %x\n", in fc_disc_gpn_id_resp()
633 FC_DISC_DBG(disc, "GPN_ID unexpected response code %x\n", in fc_disc_gpn_id_resp()
636 fc_disc_restart(disc); in fc_disc_gpn_id_resp()
639 mutex_unlock(&disc->disc_mutex); in fc_disc_gpn_id_resp()
694 struct fc_disc *disc = &lport->disc; in fc_disc_stop() local
696 if (disc->pending) in fc_disc_stop()
697 cancel_delayed_work_sync(&disc->disc_work); in fc_disc_stop()
698 fc_disc_stop_rports(disc); in fc_disc_stop()
721 struct fc_disc *disc = &lport->disc; in fc_disc_config() local
735 disc = &lport->disc; in fc_disc_config()
737 disc->priv = priv; in fc_disc_config()
747 struct fc_disc *disc = &lport->disc; in fc_disc_init() local
749 INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout); in fc_disc_init()
750 mutex_init(&disc->disc_mutex); in fc_disc_init()
751 INIT_LIST_HEAD(&disc->rports); in fc_disc_init()