Removed outer port use from fcs create and fcs destroy.
Made fcdev available via fcs_state for previously used some of the fields
from outer port, e.g. egress handler and framesize from outer port.
Also added fcdev to fc_local_port and initialized this fcdev during
local port create, this fcdev will be used for frame alloc
and removing inner port later.
Also moved outer port event list to fcs_state.
Signed-off-by: Vasu Dev <[EMAIL PROTECTED]>
---
drivers/scsi/ofc/include/fc_local_port.h | 2 +
drivers/scsi/ofc/include/fcs_state.h | 4 ++
drivers/scsi/ofc/libfc/fc_local_port.c | 2 +
drivers/scsi/ofc/libfc/fc_local_port_impl.h | 1 +
drivers/scsi/ofc/libfc/fcs_state.c | 47 +++++++++++++++------------
drivers/scsi/ofc/libfc/fcs_state_impl.h | 4 ++
drivers/scsi/ofc/openfc/openfc_if.c | 7 ++--
drivers/scsi/ofc/openfc/openfc_ioctl.c | 10 +++---
8 files changed, 48 insertions(+), 29 deletions(-)
diff --git a/drivers/scsi/ofc/include/fc_local_port.h
b/drivers/scsi/ofc/include/fc_local_port.h
index 0781a8d..c7bb5ac 100644
--- a/drivers/scsi/ofc/include/fc_local_port.h
+++ b/drivers/scsi/ofc/include/fc_local_port.h
@@ -27,6 +27,7 @@
*/
#include "sa_event.h"
#include "fc_fs.h"
+#include "fcdev.h"
struct fc_local_port; /* semi-opaque. See fc_local_port_impl.h */
struct fc_remote_port;
@@ -38,6 +39,7 @@ struct fc_frame;
struct fc_ns_fts;
struct fc_local_port *fc_local_port_create(struct fc_virt_fab *,
+ struct fcdev *,
struct fc_port *,
fc_wwn_t wwpn, fc_wwn_t wwnn,
u_int timeout_msec,
diff --git a/drivers/scsi/ofc/include/fcs_state.h
b/drivers/scsi/ofc/include/fcs_state.h
index 67b9890..720d3da 100644
--- a/drivers/scsi/ofc/include/fcs_state.h
+++ b/drivers/scsi/ofc/include/fcs_state.h
@@ -20,6 +20,8 @@
#ifndef _LIBFC_FCS_STATE_H_
#define _LIBFC_FCS_STATE_H_
+#include "fcdev.h"
+
struct fcs_state;
struct fc_remote_port;
struct fc_local_port;
@@ -34,6 +36,7 @@ struct fcs_create_args {
void (*fca_prlo_notify)(void *arg, struct fc_remote_port *);
void *fca_cb_arg; /* arg for callbacks */
struct fc_port *fca_port; /* transport interface to FC fabric */
+ struct fcdev *dev; /* transport driver instance */
u_int fca_service_params; /* service parm flags from fc/fcp.h */
fc_xid_t fca_min_xid; /* starting exchange ID */
fc_xid_t fca_max_xid; /* maximum exchange ID */
@@ -51,6 +54,7 @@ void fcs_recv(struct fcs_state *, struct fc_frame *);
int fcs_local_port_set(struct fcs_state *, fc_wwn_t node, fc_wwn_t port);
int fcs_cmd_send(struct fcs_state *, struct fc_frame *,
struct fc_frame *, u_int, u_int);
+void fcs_send_event(struct fcs_state *sp, enum fc_event event);
struct fc_local_port *fcs_get_local_port(struct fcs_state *);
/*
diff --git a/drivers/scsi/ofc/libfc/fc_local_port.c
b/drivers/scsi/ofc/libfc/fc_local_port.c
index 5f28f4a..be5a559 100644
--- a/drivers/scsi/ofc/libfc/fc_local_port.c
+++ b/drivers/scsi/ofc/libfc/fc_local_port.c
@@ -869,6 +869,7 @@ void fc_local_port_table_destroy(struct fc_virt_fab *vp)
* Create Local Port.
*/
struct fc_local_port *fc_local_port_create(struct fc_virt_fab *vf,
+ struct fcdev *dev,
struct fc_port *port,
fc_wwn_t wwpn, fc_wwn_t wwnn,
u_int timeout_msec,
@@ -882,6 +883,7 @@ struct fc_local_port *fc_local_port_create(struct
fc_virt_fab *vf,
memset(lp, 0, sizeof(*lp));
lp->fl_vf = vf;
atomic_set(&lp->fl_refcnt, 1);
+ lp->dev = dev;
lp->fl_port = port;
lp->fl_port_wwn = wwpn;
lp->fl_node_wwn = wwnn;
diff --git a/drivers/scsi/ofc/libfc/fc_local_port_impl.h
b/drivers/scsi/ofc/libfc/fc_local_port_impl.h
index ce32176..ce06533 100644
--- a/drivers/scsi/ofc/libfc/fc_local_port_impl.h
+++ b/drivers/scsi/ofc/libfc/fc_local_port_impl.h
@@ -55,6 +55,7 @@ struct fc_local_port {
struct fc_virt_fab *fl_vf; /* virtual fabric */
struct list_head fl_list; /* list headed in virt_fab */
struct fc_port *fl_port; /* port to use when sending */
+ struct fcdev *dev; /* fc device instance */
struct fc_sess *fl_dns_sess; /* session for dNS queries */
struct fc_remote_port *fl_ptp_rp; /* point-to-point remote port */
struct list_head fl_sess_list; /* list of sessions */
diff --git a/drivers/scsi/ofc/libfc/fcs_state.c
b/drivers/scsi/ofc/libfc/fcs_state.c
index 78dd61a..e514504 100644
--- a/drivers/scsi/ofc/libfc/fcs_state.c
+++ b/drivers/scsi/ofc/libfc/fcs_state.c
@@ -50,7 +50,7 @@ static int fcs_local_port_prli_accept(struct fc_local_port *,
struct fc_remote_port *, void *);
static void fcs_add_remote(void *, struct fc_remote_port *, enum fc_event);
static void fcs_sess_event(int, void *);
-static void fcs_port_event(int, void *);
+static void fcs_event(int, void *);
void fcs_module_init(void)
{
@@ -75,11 +75,9 @@ struct fcs_state *fcs_create(struct fcs_create_args *ap)
{
struct fcs_state *sp;
struct fc_port *inner_port;
- struct fc_port *outer_port;
size_t mfs;
WARN_ON(!ap->fca_disc_done);
- WARN_ON(!ap->fca_port);
sp = sa_malloc(sizeof(*sp));
if (!sp)
@@ -104,8 +102,11 @@ struct fcs_state *fcs_create(struct fcs_create_args *ap)
if (!inner_port)
goto error;
sp->fs_inner_port = inner_port;
- outer_port = ap->fca_port;
- mfs = fc_port_get_max_frame_size(outer_port);
+
+ if (!ap->dev)
+ goto error;
+
+ mfs = ap->dev->framesize;
if (mfs < FC_MIN_MAX_PAYLOAD) {
OFC_DBG("port max frame size only %zx (0x%zx) bytes - "
"setting to %d", mfs, mfs, FC_MIN_MAX_PAYLOAD);
@@ -117,12 +118,12 @@ struct fcs_state *fcs_create(struct fcs_create_args *ap)
}
fc_port_set_max_frame_size(inner_port, mfs);
fc_port_set_ingress(inner_port, fcs_recv_req, sp);
- fc_port_set_egress(inner_port, (int (*)(void *, struct fc_frame *))
- fc_port_egress, outer_port);
- fc_port_set_frame_alloc(inner_port, outer_port->np_frame_alloc);
- fc_port_set_ingress(outer_port,
- (void (*)(void *, struct fc_frame *))fcs_recv, sp);
- if (!fc_port_enq_handler(outer_port, fcs_port_event, sp))
+
+ sp->events = sa_event_list_alloc();
+ if (!sp->events)
+ goto error;
+
+ if (!sa_event_enq(sp->events, fcs_event, (void *)sp))
goto error;
return sp;
@@ -131,7 +132,7 @@ error:
return NULL;
}
-static int fcs_drop(void *arg, struct fc_frame *fp)
+static int fcs_drop(struct fcdev *hba, struct fc_frame *fp)
{
fc_frame_free(fp);
return 0;
@@ -144,30 +145,28 @@ void fcs_destroy(struct fcs_state *sp)
{
struct fc_port *port;
- WARN_ON(!sp->fs_args.fca_port);
+ WARN_ON(!sp->fs_args.dev);
sp->fs_args.fca_disc_done = (void (*)(void *))fcs_nop;
sp->fs_args.fca_remote_port_state_change =
(void (*)(void *, struct fc_remote_port *))fcs_nop;
fcs_ev_add(sp, OFC_EV_HBA_DEL, NULL, 0);
- fc_port_set_egress(sp->fs_args.fca_port, fcs_drop, NULL);
-
- fc_port_deq_handler(sp->fs_args.fca_port, fcs_port_event, sp);
+ sp->fs_args.dev->port_ops.send = fcs_drop;
+ sa_event_deq(sp->events, fcs_event, (void *)sp);
+ sa_event_list_free(sp->events);
port = sp->fs_inner_port;
if (port) {
sp->fs_inner_port = NULL;
fc_port_close_ingress(port);
- fc_port_close_egress(port);
}
- fc_port_close_ingress(sp->fs_args.fca_port);
+
if (sp->fs_local_port) {
fc_local_port_destroy(sp->fs_local_port);
fc_local_port_release(sp->fs_local_port);
}
if (sp->fs_vf)
fc_virt_fab_free(sp->fs_vf);
- fc_port_close_egress(sp->fs_args.fca_port);
sa_free(sp);
}
@@ -215,7 +214,8 @@ int fcs_local_port_set(struct fcs_state *sp, fc_wwn_t wwnn,
fc_wwn_t wwpn)
WARN_ON(!sp->fs_inner_port);
WARN_ON(sp->fs_local_port);
- lp = fc_local_port_create(sp->fs_vf, sp->fs_inner_port, wwpn, wwnn,
+ lp = fc_local_port_create(sp->fs_vf, sp->fs_args.dev,
+ sp->fs_inner_port, wwpn, wwnn,
sp->fs_args.fca_e_d_tov,
sp->fs_args.fca_plogi_retries);
if (!lp)
@@ -426,7 +426,12 @@ struct fc_sess *fcs_sess_get(struct fcs_state *sp, struct
fc_remote_port *rp)
return sess;
}
-static void fcs_port_event(int event, void *sp_arg)
+void fcs_send_event(struct fcs_state *sp, enum fc_event event)
+{
+ sa_event_call(sp->events, event);
+}
+
+static void fcs_event(int event, void *sp_arg)
{
struct fcs_state *sp = sp_arg;
diff --git a/drivers/scsi/ofc/libfc/fcs_state_impl.h
b/drivers/scsi/ofc/libfc/fcs_state_impl.h
index 9f4ecc1..d33b49c 100644
--- a/drivers/scsi/ofc/libfc/fcs_state_impl.h
+++ b/drivers/scsi/ofc/libfc/fcs_state_impl.h
@@ -20,6 +20,9 @@
#ifndef _OPENFC_FCS_STATE_IMPL_H_
#define _OPENFC_FCS_STATE_IMPL_H_
+#include "sa_event.h"
+#include "fc_event.h"
+
/*
* Private state structure.
*/
@@ -29,6 +32,7 @@ struct fcs_state {
struct fc_local_port *fs_local_port; /* local port */
struct fc_port *fs_inner_port; /* port used by local port */
uint8_t fs_disc_done; /* discovery complete */
+ struct sa_event_list *events; /* fcs events */
};
void fcs_ev_destroy(void);
diff --git a/drivers/scsi/ofc/openfc/openfc_if.c
b/drivers/scsi/ofc/openfc/openfc_if.c
index 53bbfb1..20bf568 100644
--- a/drivers/scsi/ofc/openfc/openfc_if.c
+++ b/drivers/scsi/ofc/openfc/openfc_if.c
@@ -981,6 +981,7 @@ int openfc_register(struct fcdev *dev)
ofc_fcs_args.fca_max_xid = OPENFC_MAX_XID;
ofc_fcs_args.fca_cb_arg = (void *)openfcp;
+ ofc_fcs_args.dev = dev;
openfcp->fcs_state = fcs_create(&ofc_fcs_args);
if (openfcp->fcs_state == NULL) {
OFC_DBG("Could not create fcs_state structure");
@@ -1018,7 +1019,7 @@ int openfc_register(struct fcdev *dev)
goto out_fcs;
}
if (dev->fd_link_status == TRANS_LINK_DOWN) {
- fc_port_send_event(openfcp->fcs_port, FC_EV_DOWN);
+ fcs_send_event(openfcp->fcs_state, FC_EV_DOWN);
openfcp->status &= ~OPENFC_LINK_UP;
}
if (dev->options & TRANS_O_FCS_AUTO) {
@@ -1120,7 +1121,7 @@ void openfc_linkup(struct fcdev *dev)
struct openfc_softc *openfcp = openfc_get_softc(dev);
if (!(openfcp->status & OPENFC_LINK_UP)) {
- fc_port_send_event(openfcp->fcs_port, FC_EV_READY);
+ fcs_send_event(openfcp->fcs_state, FC_EV_READY);
openfcp->status |= OPENFC_LINK_UP;
}
}
@@ -1136,7 +1137,7 @@ void openfc_linkdown(struct fcdev *dev)
struct fc_scsi_pkt *fsp;
if (openfcp->status & OPENFC_LINK_UP) {
- fc_port_send_event(openfcp->fcs_port, FC_EV_DOWN);
+ fcs_send_event(openfcp->fcs_state, FC_EV_DOWN);
openfcp->status &= ~(OPENFC_LINK_UP);
fsp = openfc_alloc_scsi_pkt(openfcp);
openfc_scsi_cleanup(fsp);
diff --git a/drivers/scsi/ofc/openfc/openfc_ioctl.c
b/drivers/scsi/ofc/openfc/openfc_ioctl.c
index 60662d9..0b1ec62 100644
--- a/drivers/scsi/ofc/openfc/openfc_ioctl.c
+++ b/drivers/scsi/ofc/openfc/openfc_ioctl.c
@@ -189,14 +189,14 @@ static int openfc_ioctl(struct inode *inode, struct file
*file,
port->pi_max_frame_size = FC_MAX_PAYLOAD;
port->pi_class = FC_COS_CLASS3;
- if (fc_port_ready(openfcp->fcs_port) == 0) {
+ if (openfcp->fcs_state == NULL)
port->pi_port_state = OFC_PSTATE_NOLINK;
- } else if (atomic_read(&openfcp->fcs_status) ==
- OPENFC_FCS_ONLINE) {
+ else if (atomic_read(&openfcp->fcs_status) ==
+ OPENFC_FCS_ONLINE)
port->pi_port_state = OFC_PSTATE_ONLINE;
- } else {
+ else
port->pi_port_state = OFC_PSTATE_OFFLINE;
- }
+
lp = fcs_get_local_port(openfcp->fcs_state);
fm = fc_local_port_get_fc4_map(lp);
memcpy(port->pi_fc4_support, fm, sizeof(*fm));
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html