Lines Matching refs:disc
18 * The disc mutex is can be locked when acquiring rport locks, but may not
49 * @disc: The discovery job to stop remote ports on
51 static void fc_disc_stop_rports(struct fc_disc *disc)
55 lockdep_assert_held(&disc->disc_mutex);
57 list_for_each_entry(rdata, &disc->rports, peers) {
67 * @disc: The discovery object to which the RSCN applies
70 static void fc_disc_recv_rscn_req(struct fc_disc *disc, struct fc_frame *fp)
83 lockdep_assert_held(&disc->disc_mutex);
85 lport = fc_disc_lport(disc);
87 FC_DISC_DBG(disc, "Received an RSCN event\n");
120 FC_DISC_DBG(disc, "Port address format for port "
135 FC_DISC_DBG(disc, "Address format is (%d)\n", fmt);
155 FC_DISC_DBG(disc, "RSCN received: rediscovering\n");
156 fc_disc_restart(disc);
158 FC_DISC_DBG(disc, "RSCN received: not rediscovering. "
160 redisc, lport->state, disc->pending);
165 FC_DISC_DBG(disc, "Received a bad RSCN frame\n");
184 struct fc_disc *disc = &lport->disc;
189 mutex_lock(&disc->disc_mutex);
190 fc_disc_recv_rscn_req(disc, fp);
191 mutex_unlock(&disc->disc_mutex);
194 FC_DISC_DBG(disc, "Received an unsupported request, "
203 * @disc: The discovery object to be restarted
205 static void fc_disc_restart(struct fc_disc *disc)
207 lockdep_assert_held(&disc->disc_mutex);
209 if (!disc->disc_callback)
212 FC_DISC_DBG(disc, "Restarting discovery\n");
214 disc->requested = 1;
215 if (disc->pending)
223 disc->disc_id = (disc->disc_id + 2) | 1;
224 disc->retry_count = 0;
225 fc_disc_gpn_ft_req(disc);
237 struct fc_disc *disc = &lport->disc;
240 * At this point we may have a new disc job or an existing
244 mutex_lock(&disc->disc_mutex);
245 disc->disc_callback = disc_callback;
246 fc_disc_restart(disc);
247 mutex_unlock(&disc->disc_mutex);
252 * @disc: The discovery context
255 static void fc_disc_done(struct fc_disc *disc, enum fc_disc_event event)
257 struct fc_lport *lport = fc_disc_lport(disc);
260 lockdep_assert_held(&disc->disc_mutex);
261 FC_DISC_DBG(disc, "Discovery complete\n");
263 disc->pending = 0;
264 if (disc->requested) {
265 fc_disc_restart(disc);
276 * is protected by the disc mutex which is already held on entry.
278 list_for_each_entry(rdata, &disc->rports, peers) {
282 if (rdata->disc_id == disc->disc_id)
289 mutex_unlock(&disc->disc_mutex);
290 disc->disc_callback(lport, event);
291 mutex_lock(&disc->disc_mutex);
296 * @disc: The discovery context
299 static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp)
301 struct fc_lport *lport = fc_disc_lport(disc);
304 FC_DISC_DBG(disc, "Error %d, retries %d/%d\n",
305 PTR_ERR_OR_ZERO(fp), disc->retry_count,
313 if (disc->retry_count < FC_DISC_RETRY_LIMIT) {
321 if (!disc->retry_count)
324 disc->retry_count++;
325 schedule_delayed_work(&disc->disc_work, delay);
327 fc_disc_done(disc, DISC_EV_FAILED);
334 disc->pending = 0;
340 * @disc: The discovery context
342 static void fc_disc_gpn_ft_req(struct fc_disc *disc)
345 struct fc_lport *lport = fc_disc_lport(disc);
347 lockdep_assert_held(&disc->disc_mutex);
351 disc->pending = 1;
352 disc->requested = 0;
354 disc->buf_len = 0;
355 disc->seq_count = 0;
365 disc, 3 * lport->r_a_tov))
368 fc_disc_error(disc, NULL);
373 * @disc: The discovery context
379 static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)
390 lport = fc_disc_lport(disc);
391 disc->seq_count++;
399 tlen = disc->buf_len;
400 disc->buf_len = 0;
408 np = &disc->partial_buf;
418 disc->buf_len = (unsigned char) plen;
420 disc->buf_len = 0;
439 rdata->disc_id = disc->disc_id;
449 fc_disc_done(disc, DISC_EV_SUCCESS);
463 if (np != &disc->partial_buf) {
464 FC_DISC_DBG(disc, "Partial buffer remains "
466 memcpy(&disc->partial_buf, np, len);
468 disc->buf_len = (unsigned char) len;
479 struct fc_disc *disc = container_of(work,
482 mutex_lock(&disc->disc_mutex);
483 fc_disc_gpn_ft_req(disc);
484 mutex_unlock(&disc->disc_mutex);
493 * Locking Note: This function is called without disc mutex held, and
499 struct fc_disc *disc = disc_arg;
507 mutex_lock(&disc->disc_mutex);
508 FC_DISC_DBG(disc, "Received a GPN_FT response\n");
511 fc_disc_error(disc, fp);
512 mutex_unlock(&disc->disc_mutex);
520 if (fr_sof(fp) == FC_SOF_I3 && seq_cnt == 0 && disc->seq_count == 0) {
523 FC_DISC_DBG(disc, "GPN_FT response too short, len %d\n",
530 error = fc_disc_gpn_ft_parse(disc, cp + 1, len);
532 FC_DISC_DBG(disc, "GPN_FT rejected reason %x exp %x "
540 FC_DISC_DBG(disc, "GPN_FT unexpected response code "
544 } else if (fr_sof(fp) == FC_SOF_N3 && seq_cnt == disc->seq_count) {
545 error = fc_disc_gpn_ft_parse(disc, fh + 1, len);
547 FC_DISC_DBG(disc, "GPN_FT unexpected frame - out of sequence? "
549 seq_cnt, disc->seq_count, fr_sof(fp), fr_eof(fp));
553 fc_disc_error(disc, ERR_PTR(error));
555 fc_disc_done(disc, event);
557 mutex_unlock(&disc->disc_mutex);
566 * Locking Note: This function is called without disc mutex held.
574 struct fc_disc *disc;
580 disc = &lport->disc;
585 mutex_lock(&disc->disc_mutex);
586 fc_disc_restart(disc);
587 mutex_unlock(&disc->disc_mutex);
604 FC_DISC_DBG(disc, "GPN_ID accepted. WWPN changed. "
609 mutex_lock(&lport->disc.disc_mutex);
611 mutex_unlock(&lport->disc.disc_mutex);
613 new_rdata->disc_id = disc->disc_id;
618 rdata->disc_id = disc->disc_id;
622 FC_DISC_DBG(disc, "GPN_ID rejected reason %x exp %x\n",
626 FC_DISC_DBG(disc, "GPN_ID unexpected response code %x\n",
629 mutex_lock(&disc->disc_mutex);
630 fc_disc_restart(disc);
631 mutex_unlock(&disc->disc_mutex);
651 lockdep_assert_held(&lport->disc.disc_mutex);
673 lockdep_assert_held(&lport->disc.disc_mutex);
688 struct fc_disc *disc = &lport->disc;
690 if (disc->pending)
691 cancel_delayed_work_sync(&disc->disc_work);
692 mutex_lock(&disc->disc_mutex);
693 fc_disc_stop_rports(disc);
694 mutex_unlock(&disc->disc_mutex);
717 struct fc_disc *disc;
731 disc = &lport->disc;
733 disc->priv = priv;
743 struct fc_disc *disc = &lport->disc;
745 INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout);
746 mutex_init(&disc->disc_mutex);
747 INIT_LIST_HEAD(&disc->rports);