static void fc_lport_recv_logo_req(struct fc_seq *sp, struct fc_frame *fp, struct fc_lport *lport) { lport->tt.seq_els_rsp_send(sp, ELS_LS_ACC, NULL); fc_lport_enter_reset(lport); fc_frame_free(fp); }
/** * fc_set_mfs() - Set the maximum frame size for a local port * @lport: The local port to set the MFS for * @mfs: The new MFS */ int fc_set_mfs(struct fc_lport *lport, u32 mfs) { unsigned int old_mfs; int rc = -EINVAL; mutex_lock(&lport->lp_mutex); old_mfs = lport->mfs; if (mfs >= FC_MIN_MAX_FRAME) { mfs &= ~3; if (mfs > FC_MAX_FRAME) mfs = FC_MAX_FRAME; mfs -= sizeof(struct fc_frame_header); lport->mfs = mfs; rc = 0; } if (!rc && mfs < old_mfs) fc_lport_enter_reset(lport); mutex_unlock(&lport->lp_mutex); return rc; }
/** * fc_lport_error() - Handler for any errors * @lport: The local port that the error was on * @fp: The error code encoded in a frame pointer * * If the error was caused by a resource allocation failure * then wait for half a second and retry, otherwise retry * after the e_d_tov time. */ static void fc_lport_error(struct fc_lport *lport, struct fc_frame *fp) { unsigned long delay = 0; FC_LPORT_DBG(lport, "Error %ld in state %s, retries %d\n", PTR_ERR(fp), fc_lport_state(lport), lport->retry_count); if (PTR_ERR(fp) == -FC_EX_CLOSED) return; /* * Memory allocation failure, or the exchange timed out * or we received LS_RJT. * Retry after delay */ if (lport->retry_count < lport->max_retry_count) { lport->retry_count++; if (!fp) delay = msecs_to_jiffies(500); else delay = msecs_to_jiffies(lport->e_d_tov); schedule_delayed_work(&lport->retry_work, delay); } else fc_lport_enter_reset(lport); }
static void fc_lport_error(struct fc_lport *lport, struct fc_frame *fp) { unsigned long delay = 0; FC_LPORT_DBG(lport, "Error %ld in state %s, retries %d\n", PTR_ERR(fp), fc_lport_state(lport), lport->retry_count); if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) { if (lport->retry_count < lport->max_retry_count) { lport->retry_count++; if (!fp) delay = msecs_to_jiffies(500); else delay = msecs_to_jiffies(lport->e_d_tov); schedule_delayed_work(&lport->retry_work, delay); } else { switch (lport->state) { case LPORT_ST_DISABLED: case LPORT_ST_READY: case LPORT_ST_RESET: case LPORT_ST_RPN_ID: case LPORT_ST_RFT_ID: case LPORT_ST_SCR: case LPORT_ST_DNS: case LPORT_ST_FLOGI: case LPORT_ST_LOGO: fc_lport_enter_reset(lport); break; } } } }
/** * fc_lport_reset() - Reset a local port * @lport: The local port which should be reset * * Locking Note: This functions should not be called with the * lport lock held. */ int fc_lport_reset(struct fc_lport *lport) { cancel_delayed_work_sync(&lport->retry_work); mutex_lock(&lport->lp_mutex); fc_lport_enter_reset(lport); mutex_unlock(&lport->lp_mutex); return 0; }
/** * __fc_linkdown() - Handler for transport linkdown events * @lport: The lport whose link is down * * Locking: must be called with the lp_mutex held */ void __fc_linkdown(struct fc_lport *lport) { if (lport->link_up) { lport->link_up = 0; fc_lport_enter_reset(lport); lport->tt.fcp_cleanup(lport); } }
/** * fc_fabric_login() - Start the lport state machine * @lport: The local port that should log into the fabric * * Locking Note: This function should not be called * with the lport lock held. */ int fc_fabric_login(struct fc_lport *lport) { int rc = -1; mutex_lock(&lport->lp_mutex); if (lport->state == LPORT_ST_DISABLED) { fc_lport_enter_reset(lport); rc = 0; } mutex_unlock(&lport->lp_mutex); return rc; }
void fc_linkdown(struct fc_lport *lport) { mutex_lock(&lport->lp_mutex); printk(KERN_INFO "libfc: Link down on port (%6x)\n", fc_host_port_id(lport->host)); if (lport->link_up) { lport->link_up = 0; fc_lport_enter_reset(lport); lport->tt.fcp_cleanup(lport); } mutex_unlock(&lport->lp_mutex); }
void fc_lport_disc_callback(struct fc_lport *lport, enum fc_disc_event event) { switch (event) { case DISC_EV_SUCCESS: FC_LPORT_DBG(lport, "Discovery succeeded\n"); break; case DISC_EV_FAILED: printk(KERN_ERR "libfc: Discovery failed for port (%6x)\n", fc_host_port_id(lport->host)); mutex_lock(&lport->lp_mutex); fc_lport_enter_reset(lport); mutex_unlock(&lport->lp_mutex); break; case DISC_EV_NONE: WARN_ON(1); break; } }
static void fc_lport_error(struct fc_lport *lport, struct fc_frame *fp) { unsigned long delay = 0; FC_LPORT_DBG(lport, "Error %ld in state %s, retries %d\n", PTR_ERR(fp), fc_lport_state(lport), lport->retry_count); if (PTR_ERR(fp) == -FC_EX_CLOSED) return; if (lport->retry_count < lport->max_retry_count) { lport->retry_count++; if (!fp) delay = msecs_to_jiffies(500); else delay = msecs_to_jiffies(lport->e_d_tov); schedule_delayed_work(&lport->retry_work, delay); } else fc_lport_enter_reset(lport); }