Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 228b5b7e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: (31 commits)
  [SCSI] qla2xxx: Update version number to 8.03.00-k4.
  [SCSI] qla2xxx: Correct overwrite of pre-assigned init-control-block structure size.
  [SCSI] qla2xxx: Correct truncation in return-code status checking.
  [SCSI] qla2xxx: Correct vport delete bug.
  [SCSI] qla2xxx: Use correct value for max vport in LOOP topology.
  [SCSI] qla2xxx: Correct address range checking for option-rom updates.
  [SCSI] fcoe: Change fcoe receive thread nice value from 19 (lowest priority) to -20
  [SCSI] fcoe: fix handling of pending queue, prevent out of order frames (v3)
  [SCSI] fcoe: Out of order tx frames was causing several check condition SCSI status
  [SCSI] fcoe: fix kfree(skb)
  [SCSI] fcoe: ETH_P_8021Q is already in if_ether and fcoe is not using it anyway
  [SCSI] libfc: do not change the fh_rx_id of a recevied frame
  [SCSI] fcoe: Correct fcoe_transports initialization vs. registration
  [SCSI] fcoe: Use setup_timer() and mod_timer()
  [SCSI] libfc, fcoe: Remove unnecessary cast by removing inline wrapper
  [SCSI] libfc, fcoe: Cleanup function formatting and minor typos
  [SCSI] libfc, fcoe: Fix kerneldoc comments
  [SCSI] libfc: Cleanup libfc_function_template comments
  [SCSI] libfc: check for err when recv and state is incorrect
  [SCSI] libfc: rename rp to rdata in fc_disc_new_target()
  ...
parents 37e79a43 5fa0ae19
Loading
Loading
Loading
Loading
+44 −47
Original line number Diff line number Diff line
@@ -33,19 +33,19 @@ static LIST_HEAD(fcoe_transports);
static DEFINE_MUTEX(fcoe_transports_lock);

/**
 * fcoe_transport_default - returns ptr to the default transport fcoe_sw
 **/
 * fcoe_transport_default() - Returns ptr to the default transport fcoe_sw
 */
struct fcoe_transport *fcoe_transport_default(void)
{
	return &fcoe_sw_transport;
}

/**
 * fcoe_transport_to_pcidev - get the pci dev from a netdev
 * fcoe_transport_to_pcidev() - get the pci dev from a netdev
 * @netdev: the netdev that pci dev will be retrived from
 *
 * Returns: NULL or the corrsponding pci_dev
 **/
 */
struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev)
{
	if (!netdev->dev.parent)
@@ -54,18 +54,17 @@ struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev)
}

/**
 * fcoe_transport_device_lookup - find out netdev is managed by the
 * transport
 * assign a transport to a device
 * fcoe_transport_device_lookup() - Lookup a transport
 * @netdev: the netdev the transport to be attached to
 *
 * This will look for existing offload driver, if not found, it falls back to
 * the default sw hba (fcoe_sw) as its fcoe transport.
 *
 * Returns: 0 for success
 **/
static struct fcoe_transport_internal *fcoe_transport_device_lookup(
	struct fcoe_transport *t, struct net_device *netdev)
 */
static struct fcoe_transport_internal *
fcoe_transport_device_lookup(struct fcoe_transport *t,
			     struct net_device *netdev)
{
	struct fcoe_transport_internal *ti;

@@ -81,14 +80,14 @@ static struct fcoe_transport_internal *fcoe_transport_device_lookup(
	return NULL;
}
/**
 * fcoe_transport_device_add - assign a transport to a device
 * fcoe_transport_device_add() - Assign a transport to a device
 * @netdev: the netdev the transport to be attached to
 *
 * This will look for existing offload driver, if not found, it falls back to
 * the default sw hba (fcoe_sw) as its fcoe transport.
 *
 * Returns: 0 for success
 **/
 */
static int fcoe_transport_device_add(struct fcoe_transport *t,
				     struct net_device *netdev)
{
@@ -123,14 +122,14 @@ static int fcoe_transport_device_add(struct fcoe_transport *t,
}

/**
 * fcoe_transport_device_remove - remove a device from its transport
 * fcoe_transport_device_remove() - Remove a device from its transport
 * @netdev: the netdev the transport to be attached to
 *
 * this removes the device from the transport so the given transport will
 * This removes the device from the transport so the given transport will
 * not manage this device any more
 *
 * Returns: 0 for success
 **/
 */
static int fcoe_transport_device_remove(struct fcoe_transport *t,
					struct net_device *netdev)
{
@@ -155,13 +154,13 @@ static int fcoe_transport_device_remove(struct fcoe_transport *t,
}

/**
 * fcoe_transport_device_remove_all - remove all from transport devlist
 * fcoe_transport_device_remove_all() - Remove all from transport devlist
 *
 * this removes the device from the transport so the given transport will
 * This removes the device from the transport so the given transport will
 * not manage this device any more
 *
 * Returns: 0 for success
 **/
 */
static void fcoe_transport_device_remove_all(struct fcoe_transport *t)
{
	struct fcoe_transport_internal *ti, *tmp;
@@ -175,16 +174,16 @@ static void fcoe_transport_device_remove_all(struct fcoe_transport *t)
}

/**
 * fcoe_transport_match - use the bus device match function to match the hw
 * @t: the fcoe transport
 * @netdev:
 * fcoe_transport_match() - Use the bus device match function to match the hw
 * @t: The fcoe transport to check
 * @netdev: The netdev to match against
 *
 * This function is used to check if the givne transport wants to manage the
 * This function is used to check if the given transport wants to manage the
 * input netdev. if the transports implements the match function, it will be
 * called, o.w. we just compare the pci vendor and device id.
 *
 * Returns: true for match up
 **/
 */
static bool fcoe_transport_match(struct fcoe_transport *t,
				 struct net_device *netdev)
{
@@ -210,17 +209,17 @@ static bool fcoe_transport_match(struct fcoe_transport *t,
}

/**
 * fcoe_transport_lookup - check if the transport is already registered
 * fcoe_transport_lookup() - Check if the transport is already registered
 * @t: the transport to be looked up
 *
 * This compares the parent device (pci) vendor and device id
 *
 * Returns: NULL if not found
 *
 * TODO - return default sw transport if no other transport is found
 **/
static struct fcoe_transport *fcoe_transport_lookup(
	struct net_device *netdev)
 * TODO: return default sw transport if no other transport is found
 */
static struct fcoe_transport *
fcoe_transport_lookup(struct net_device *netdev)
{
	struct fcoe_transport *t;

@@ -239,11 +238,11 @@ static struct fcoe_transport *fcoe_transport_lookup(
}

/**
 * fcoe_transport_register - adds a fcoe transport to the fcoe transports list
 * fcoe_transport_register() - Adds a fcoe transport to the fcoe transports list
 * @t: ptr to the fcoe transport to be added
 *
 * Returns: 0 for success
 **/
 */
int fcoe_transport_register(struct fcoe_transport *t)
{
	struct fcoe_transport *tt;
@@ -259,9 +258,6 @@ int fcoe_transport_register(struct fcoe_transport *t)
	list_add_tail(&t->list, &fcoe_transports);
	mutex_unlock(&fcoe_transports_lock);

	mutex_init(&t->devlock);
	INIT_LIST_HEAD(&t->devlist);

	printk(KERN_DEBUG "fcoe_transport_register:%s\n", t->name);

	return 0;
@@ -269,11 +265,11 @@ int fcoe_transport_register(struct fcoe_transport *t)
EXPORT_SYMBOL_GPL(fcoe_transport_register);

/**
 * fcoe_transport_unregister - remove the tranport fro the fcoe transports list
 * fcoe_transport_unregister() - Remove the tranport fro the fcoe transports list
 * @t: ptr to the fcoe transport to be removed
 *
 * Returns: 0 for success
 **/
 */
int fcoe_transport_unregister(struct fcoe_transport *t)
{
	struct fcoe_transport *tt, *tmp;
@@ -294,8 +290,8 @@ int fcoe_transport_unregister(struct fcoe_transport *t)
}
EXPORT_SYMBOL_GPL(fcoe_transport_unregister);

/*
 * fcoe_load_transport_driver - load an offload driver by alias name
/**
 * fcoe_load_transport_driver() - Load an offload driver by alias name
 * @netdev: the target net device
 *
 * Requests for an offload driver module as the fcoe transport, if fails, it
@@ -307,7 +303,7 @@ EXPORT_SYMBOL_GPL(fcoe_transport_unregister);
 * 	3. pure hw fcoe hba may not have netdev
 *
 * Returns: 0 for success
 **/
 */
int fcoe_load_transport_driver(struct net_device *netdev)
{
	struct pci_dev *pci;
@@ -335,14 +331,14 @@ int fcoe_load_transport_driver(struct net_device *netdev)
EXPORT_SYMBOL_GPL(fcoe_load_transport_driver);

/**
 * fcoe_transport_attach - load transport to fcoe
 * fcoe_transport_attach() - Load transport to fcoe
 * @netdev: the netdev the transport to be attached to
 *
 * This will look for existing offload driver, if not found, it falls back to
 * the default sw hba (fcoe_sw) as its fcoe transport.
 *
 * Returns: 0 for success
 **/
 */
int fcoe_transport_attach(struct net_device *netdev)
{
	struct fcoe_transport *t;
@@ -373,11 +369,11 @@ int fcoe_transport_attach(struct net_device *netdev)
EXPORT_SYMBOL_GPL(fcoe_transport_attach);

/**
 * fcoe_transport_release - unload transport from fcoe
 * fcoe_transport_release() - Unload transport from fcoe
 * @netdev: the net device on which fcoe is to be released
 *
 * Returns: 0 for success
 **/
 */
int fcoe_transport_release(struct net_device *netdev)
{
	struct fcoe_transport *t;
@@ -410,12 +406,12 @@ int fcoe_transport_release(struct net_device *netdev)
EXPORT_SYMBOL_GPL(fcoe_transport_release);

/**
 * fcoe_transport_init - initializes fcoe transport layer
 * fcoe_transport_init() - Initializes fcoe transport layer
 *
 * This prepares for the fcoe transport layer
 *
 * Returns: none
 **/
 */
int __init fcoe_transport_init(void)
{
	INIT_LIST_HEAD(&fcoe_transports);
@@ -424,12 +420,13 @@ int __init fcoe_transport_init(void)
}

/**
 * fcoe_transport_exit - cleans up the fcoe transport layer
 * fcoe_transport_exit() - Cleans up the fcoe transport layer
 *
 * This cleans up the fcoe transport layer. removing any transport on the list,
 * note that the transport destroy func is not called here.
 *
 * Returns: none
 **/
 */
int __exit fcoe_transport_exit(void)
{
	struct fcoe_transport *t, *tmp;
+29 −27
Original line number Diff line number Diff line
@@ -104,19 +104,19 @@ static struct scsi_host_template fcoe_sw_shost_template = {
	.max_sectors = 0xffff,
};

/*
 * fcoe_sw_lport_config - sets up the fc_lport
/**
 * fcoe_sw_lport_config() - sets up the fc_lport
 * @lp: ptr to the fc_lport
 * @shost: ptr to the parent scsi host
 *
 * Returns: 0 for success
 *
 */
static int fcoe_sw_lport_config(struct fc_lport *lp)
{
	int i = 0;

	lp->link_status = 0;
	lp->link_up = 0;
	lp->qfull = 0;
	lp->max_retry_count = 3;
	lp->e_d_tov = 2 * 1000;	/* FC-FS default */
	lp->r_a_tov = 2 * 2 * 1000;
@@ -136,16 +136,14 @@ static int fcoe_sw_lport_config(struct fc_lport *lp)
	return 0;
}

/*
 * fcoe_sw_netdev_config - sets up fcoe_softc for lport and network
 * related properties
/**
 * fcoe_sw_netdev_config() - Set up netdev for SW FCoE
 * @lp : ptr to the fc_lport
 * @netdev : ptr to the associated netdevice struct
 *
 * Must be called after fcoe_sw_lport_config() as it will use lport mutex
 *
 * Returns : 0 for success
 *
 */
static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)
{
@@ -181,9 +179,8 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)
	if (fc_set_mfs(lp, mfs))
		return -EINVAL;

	lp->link_status = ~FC_PAUSE & ~FC_LINK_UP;
	if (!fcoe_link_ok(lp))
		lp->link_status |= FC_LINK_UP;
		lp->link_up = 1;

	/* offload features support */
	if (fc->real_dev->features & NETIF_F_SG)
@@ -191,6 +188,7 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)


	skb_queue_head_init(&fc->fcoe_pending_queue);
	fc->fcoe_pending_queue_active = 0;

	/* setup Source Mac Address */
	memcpy(fc->ctl_src_addr, fc->real_dev->dev_addr,
@@ -224,16 +222,15 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)
	return 0;
}

/*
 * fcoe_sw_shost_config - sets up fc_lport->host
/**
 * fcoe_sw_shost_config() - Sets up fc_lport->host
 * @lp : ptr to the fc_lport
 * @shost : ptr to the associated scsi host
 * @dev : device associated to scsi host
 *
 * Must be called after fcoe_sw_lport_config) and fcoe_sw_netdev_config()
 * Must be called after fcoe_sw_lport_config() and fcoe_sw_netdev_config()
 *
 * Returns : 0 for success
 *
 */
static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost,
				struct device *dev)
@@ -261,8 +258,8 @@ static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost,
	return 0;
}

/*
 * fcoe_sw_em_config - allocates em for this lport
/**
 * fcoe_sw_em_config() - allocates em for this lport
 * @lp: the port that em is to allocated for
 *
 * Returns : 0 on success
@@ -279,8 +276,8 @@ static inline int fcoe_sw_em_config(struct fc_lport *lp)
	return 0;
}

/*
 * fcoe_sw_destroy - FCoE software HBA tear-down function
/**
 * fcoe_sw_destroy() - FCoE software HBA tear-down function
 * @netdev: ptr to the associated net_device
 *
 * Returns: 0 if link is OK for use by FCoE.
@@ -301,7 +298,7 @@ static int fcoe_sw_destroy(struct net_device *netdev)
	if (!lp)
		return -ENODEV;

	fc = fcoe_softc(lp);
	fc = lport_priv(lp);

	/* Logout of the fabric */
	fc_fabric_logoff(lp);
@@ -353,8 +350,8 @@ static struct libfc_function_template fcoe_sw_libfc_fcn_templ = {
	.frame_send = fcoe_xmit,
};

/*
 * fcoe_sw_create - this function creates the fcoe interface
/**
 * fcoe_sw_create() - this function creates the fcoe interface
 * @netdev: pointer the associated netdevice
 *
 * Creates fc_lport struct and scsi_host for lport, configures lport
@@ -440,8 +437,8 @@ out_host_put:
	return rc;
}

/*
 * fcoe_sw_match - the fcoe sw transport match function
/**
 * fcoe_sw_match() - The FCoE SW transport match function
 *
 * Returns : false always
 */
@@ -461,8 +458,8 @@ struct fcoe_transport fcoe_sw_transport = {
	.device = 0xffff,
};

/*
 * fcoe_sw_init - registers fcoe_sw_transport
/**
 * fcoe_sw_init() - Registers fcoe_sw_transport
 *
 * Returns : 0 on success
 */
@@ -471,17 +468,22 @@ int __init fcoe_sw_init(void)
	/* attach to scsi transport */
	scsi_transport_fcoe_sw =
		fc_attach_transport(&fcoe_sw_transport_function);

	if (!scsi_transport_fcoe_sw) {
		printk(KERN_ERR "fcoe_sw_init:fc_attach_transport() failed\n");
		return -ENODEV;
	}

	mutex_init(&fcoe_sw_transport.devlock);
	INIT_LIST_HEAD(&fcoe_sw_transport.devlist);

	/* register sw transport */
	fcoe_transport_register(&fcoe_sw_transport);
	return 0;
}

/*
 * fcoe_sw_exit - unregisters fcoe_sw_transport
/**
 * fcoe_sw_exit() - Unregisters fcoe_sw_transport
 *
 * Returns : 0 on success
 */
+136 −182

File changed.

Preview size limit exceeded, changes collapsed.

+32 −31
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ static void fc_disc_single(struct fc_disc *, struct fc_disc_port *);
static void fc_disc_restart(struct fc_disc *);

/**
 * fc_disc_lookup_rport - lookup a remote port by port_id
 * fc_disc_lookup_rport() - lookup a remote port by port_id
 * @lport: Fibre Channel host port instance
 * @port_id: remote port port_id to match
 */
@@ -92,7 +92,7 @@ struct fc_rport *fc_disc_lookup_rport(const struct fc_lport *lport,
}

/**
 * fc_disc_stop_rports - delete all the remote ports associated with the lport
 * fc_disc_stop_rports() - delete all the remote ports associated with the lport
 * @disc: The discovery job to stop rports on
 *
 * Locking Note: This function expects that the lport mutex is locked before
@@ -117,7 +117,7 @@ void fc_disc_stop_rports(struct fc_disc *disc)
}

/**
 * fc_disc_rport_callback - Event handler for rport events
 * fc_disc_rport_callback() - Event handler for rport events
 * @lport: The lport which is receiving the event
 * @rport: The rport which the event has occured on
 * @event: The event that occured
@@ -151,7 +151,7 @@ static void fc_disc_rport_callback(struct fc_lport *lport,
}

/**
 * fc_disc_recv_rscn_req - Handle Registered State Change Notification (RSCN)
 * fc_disc_recv_rscn_req() - Handle Registered State Change Notification (RSCN)
 * @sp: Current sequence of the RSCN exchange
 * @fp: RSCN Frame
 * @lport: Fibre Channel host port instance
@@ -246,7 +246,7 @@ static void fc_disc_recv_rscn_req(struct fc_seq *sp, struct fc_frame *fp,
			list_del(&dp->peers);
			rport = lport->tt.rport_lookup(lport, dp->ids.port_id);
			if (rport) {
				rdata = RPORT_TO_PRIV(rport);
				rdata = rport->dd_data;
				list_del(&rdata->peers);
				lport->tt.rport_logoff(rport);
			}
@@ -265,7 +265,7 @@ reject:
}

/**
 * fc_disc_recv_req - Handle incoming requests
 * fc_disc_recv_req() - Handle incoming requests
 * @sp: Current sequence of the request exchange
 * @fp: The frame
 * @lport: The FC local port
@@ -294,7 +294,7 @@ static void fc_disc_recv_req(struct fc_seq *sp, struct fc_frame *fp,
}

/**
 * fc_disc_restart - Restart discovery
 * fc_disc_restart() - Restart discovery
 * @lport: FC discovery context
 *
 * Locking Note: This function expects that the disc mutex
@@ -322,7 +322,7 @@ static void fc_disc_restart(struct fc_disc *disc)
}

/**
 * fc_disc_start - Fibre Channel Target discovery
 * fc_disc_start() - Fibre Channel Target discovery
 * @lport: FC local port
 *
 * Returns non-zero if discovery cannot be started.
@@ -383,7 +383,7 @@ static struct fc_rport_operations fc_disc_rport_ops = {
};

/**
 * fc_disc_new_target - Handle new target found by discovery
 * fc_disc_new_target() - Handle new target found by discovery
 * @lport: FC local port
 * @rport: The previous FC remote port (NULL if new remote port)
 * @ids: Identifiers for the new FC remote port
@@ -396,7 +396,7 @@ static int fc_disc_new_target(struct fc_disc *disc,
			      struct fc_rport_identifiers *ids)
{
	struct fc_lport *lport = disc->lport;
	struct fc_rport_libfc_priv *rp;
	struct fc_rport_libfc_priv *rdata;
	int error = 0;

	if (rport && ids->port_name) {
@@ -430,15 +430,15 @@ static int fc_disc_new_target(struct fc_disc *disc,
				dp.ids.port_name = ids->port_name;
				dp.ids.node_name = ids->node_name;
				dp.ids.roles = ids->roles;
				rport = fc_rport_rogue_create(&dp);
				rport = lport->tt.rport_create(&dp);
			}
			if (!rport)
				error = -ENOMEM;
		}
		if (rport) {
			rp = rport->dd_data;
			rp->ops = &fc_disc_rport_ops;
			rp->rp_state = RPORT_ST_INIT;
			rdata = rport->dd_data;
			rdata->ops = &fc_disc_rport_ops;
			rdata->rp_state = RPORT_ST_INIT;
			lport->tt.rport_login(rport);
		}
	}
@@ -446,20 +446,20 @@ static int fc_disc_new_target(struct fc_disc *disc,
}

/**
 * fc_disc_del_target - Delete a target
 * fc_disc_del_target() - Delete a target
 * @disc: FC discovery context
 * @rport: The remote port to be removed
 */
static void fc_disc_del_target(struct fc_disc *disc, struct fc_rport *rport)
{
	struct fc_lport *lport = disc->lport;
	struct fc_rport_libfc_priv *rdata = RPORT_TO_PRIV(rport);
	struct fc_rport_libfc_priv *rdata = rport->dd_data;
	list_del(&rdata->peers);
	lport->tt.rport_logoff(rport);
}

/**
 * fc_disc_done - Discovery has been completed
 * fc_disc_done() - Discovery has been completed
 * @disc: FC discovery context
 */
static void fc_disc_done(struct fc_disc *disc)
@@ -479,7 +479,7 @@ static void fc_disc_done(struct fc_disc *disc)
}

/**
 * fc_disc_error - Handle error on dNS request
 * fc_disc_error() - Handle error on dNS request
 * @disc: FC discovery context
 * @fp: The frame pointer
 */
@@ -519,7 +519,7 @@ static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp)
}

/**
 * fc_disc_gpn_ft_req - Send Get Port Names by FC-4 type (GPN_FT) request
 * fc_disc_gpn_ft_req() - Send Get Port Names by FC-4 type (GPN_FT) request
 * @lport: FC discovery context
 *
 * Locking Note: This function expects that the disc_mutex is locked
@@ -553,7 +553,7 @@ err:
}

/**
 * fc_disc_gpn_ft_parse - Parse the list of IDs and names resulting from a request
 * fc_disc_gpn_ft_parse() - Parse the list of IDs and names resulting from a request
 * @lport: Fibre Channel host port instance
 * @buf: GPN_FT response buffer
 * @len: size of response buffer
@@ -617,7 +617,7 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)

		if ((dp.ids.port_id != fc_host_port_id(lport->host)) &&
		    (dp.ids.port_name != lport->wwpn)) {
			rport = fc_rport_rogue_create(&dp);
			rport = lport->tt.rport_create(&dp);
			if (rport) {
				rdata = rport->dd_data;
				rdata->ops = &fc_disc_rport_ops;
@@ -658,7 +658,10 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)
	return error;
}

/*
/**
 * fc_disc_timeout() - Retry handler for the disc component
 * @work: Structure holding disc obj that needs retry discovery
 *
 * Handle retry of memory allocation for remote ports.
 */
static void fc_disc_timeout(struct work_struct *work)
@@ -673,7 +676,7 @@ static void fc_disc_timeout(struct work_struct *work)
}

/**
 * fc_disc_gpn_ft_resp - Handle a response frame from Get Port Names (GPN_FT)
 * fc_disc_gpn_ft_resp() - Handle a response frame from Get Port Names (GPN_FT)
 * @sp: Current sequence of GPN_FT exchange
 * @fp: response frame
 * @lp_arg: Fibre Channel host port instance
@@ -712,9 +715,7 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp,
			       fr_len(fp));
		} else if (ntohs(cp->ct_cmd) == FC_FS_ACC) {

			/*
			 * Accepted.  Parse response.
			 */
			/* Accepted, parse the response. */
			buf = cp + 1;
			len -= sizeof(*cp);
		} else if (ntohs(cp->ct_cmd) == FC_FS_RJT) {
@@ -746,7 +747,7 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp,
}

/**
 * fc_disc_single - Discover the directory information for a single target
 * fc_disc_single() - Discover the directory information for a single target
 * @lport: FC local port
 * @dp: The port to rediscover
 *
@@ -769,7 +770,7 @@ static void fc_disc_single(struct fc_disc *disc, struct fc_disc_port *dp)
	if (rport)
		fc_disc_del_target(disc, rport);

	new_rport = fc_rport_rogue_create(dp);
	new_rport = lport->tt.rport_create(dp);
	if (new_rport) {
		rdata = new_rport->dd_data;
		rdata->ops = &fc_disc_rport_ops;
@@ -782,7 +783,7 @@ out:
}

/**
 * fc_disc_stop - Stop discovery for a given lport
 * fc_disc_stop() - Stop discovery for a given lport
 * @lport: The lport that discovery should stop for
 */
void fc_disc_stop(struct fc_lport *lport)
@@ -796,7 +797,7 @@ void fc_disc_stop(struct fc_lport *lport)
}

/**
 * fc_disc_stop_final - Stop discovery for a given lport
 * fc_disc_stop_final() - Stop discovery for a given lport
 * @lport: The lport that discovery should stop for
 *
 * This function will block until discovery has been
@@ -809,7 +810,7 @@ void fc_disc_stop_final(struct fc_lport *lport)
}

/**
 * fc_disc_init - Initialize the discovery block
 * fc_disc_init() - Initialize the discovery block
 * @lport: FC local port
 */
int fc_disc_init(struct fc_lport *lport)
+9 −23
Original line number Diff line number Diff line
@@ -32,8 +32,6 @@
#include <scsi/libfc.h>
#include <scsi/fc_encode.h>

#define	  FC_DEF_R_A_TOV      (10 * 1000) /* resource allocation timeout */

/*
 * fc_exch_debug can be set in debugger or at compile time to get more logs.
 */
@@ -627,7 +625,6 @@ static struct fc_exch *fc_exch_resp(struct fc_exch_mgr *mp, struct fc_frame *fp)
{
	struct fc_exch *ep;
	struct fc_frame_header *fh;
	u16 rxid;

	ep = mp->lp->tt.exch_get(mp->lp, fp);
	if (ep) {
@@ -654,18 +651,6 @@ static struct fc_exch *fc_exch_resp(struct fc_exch_mgr *mp, struct fc_frame *fp)
		if ((ntoh24(fh->fh_f_ctl) & FC_FC_SEQ_INIT) == 0)
			ep->esb_stat &= ~ESB_ST_SEQ_INIT;

		/*
		 * Set the responder ID in the frame header.
		 * The old one should've been 0xffff.
		 * If it isn't, don't assign one.
		 * Incoming basic link service frames may specify
		 * a referenced RX_ID.
		 */
		if (fh->fh_type != FC_TYPE_BLS) {
			rxid = ntohs(fh->fh_rx_id);
			WARN_ON(rxid != FC_XID_UNKNOWN);
			fh->fh_rx_id = htons(ep->rxid);
		}
		fc_exch_hold(ep);	/* hold for caller */
		spin_unlock_bh(&ep->ex_lock);	/* lock from exch_get */
	}
@@ -677,8 +662,8 @@ static struct fc_exch *fc_exch_resp(struct fc_exch_mgr *mp, struct fc_frame *fp)
 * If fc_pf_rjt_reason is FC_RJT_NONE then this function will have a hold
 * on the ep that should be released by the caller.
 */
static enum fc_pf_rjt_reason
fc_seq_lookup_recip(struct fc_exch_mgr *mp, struct fc_frame *fp)
static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_exch_mgr *mp,
						 struct fc_frame *fp)
{
	struct fc_frame_header *fh = fc_frame_header_get(fp);
	struct fc_exch *ep = NULL;
@@ -996,8 +981,8 @@ static void fc_seq_send_ack(struct fc_seq *sp, const struct fc_frame *rx_fp)
 * Send BLS Reject.
 * This is for rejecting BA_ABTS only.
 */
static void
fc_exch_send_ba_rjt(struct fc_frame *rx_fp, enum fc_ba_rjt_reason reason,
static void fc_exch_send_ba_rjt(struct fc_frame *rx_fp,
				enum fc_ba_rjt_reason reason,
				enum fc_ba_rjt_explan explan)
{
	struct fc_frame *fp;
@@ -1096,7 +1081,7 @@ static void fc_exch_recv_abts(struct fc_exch *ep, struct fc_frame *rx_fp)
		ap->ba_high_seq_cnt = fh->fh_seq_cnt;
		ap->ba_low_seq_cnt = htons(sp->cnt);
	}
	sp = fc_seq_start_next(sp);
	sp = fc_seq_start_next_locked(sp);
	spin_unlock_bh(&ep->ex_lock);
	fc_seq_send_last(sp, fp, FC_RCTL_BA_ACC, FC_TYPE_BLS);
	fc_frame_free(rx_fp);
@@ -1480,10 +1465,11 @@ static void fc_exch_reset(struct fc_exch *ep)
 * If sid is non-zero, reset only exchanges we source from that FID.
 * If did is non-zero, reset only exchanges destined to that FID.
 */
void fc_exch_mgr_reset(struct fc_exch_mgr *mp, u32 sid, u32 did)
void fc_exch_mgr_reset(struct fc_lport *lp, u32 sid, u32 did)
{
	struct fc_exch *ep;
	struct fc_exch *next;
	struct fc_exch_mgr *mp = lp->emp;

	spin_lock_bh(&mp->em_lock);
restart:
@@ -1607,7 +1593,7 @@ static void fc_exch_rrq_resp(struct fc_seq *sp, struct fc_frame *fp, void *arg)
	if (IS_ERR(fp)) {
		int err = PTR_ERR(fp);

		if (err == -FC_EX_CLOSED)
		if (err == -FC_EX_CLOSED || err == -FC_EX_TIMEOUT)
			goto cleanup;
		FC_DBG("Cannot process RRQ, because of frame error %d\n", err);
		return;
Loading