Commit b1c1b6a3 authored by Bryan O'Sullivan's avatar Bryan O'Sullivan Committed by Roland Dreier

IB/ipath: merge ipath_core and ib_ipath drivers

There is little point in keeping the two drivers separate, so we are
merging them.
Signed-off-by: default avatarBryan O'Sullivan <bryan.osullivan@qlogic.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent 367fe711
obj-$(CONFIG_INFINIBAND) += core/ obj-$(CONFIG_INFINIBAND) += core/
obj-$(CONFIG_INFINIBAND_MTHCA) += hw/mthca/ obj-$(CONFIG_INFINIBAND_MTHCA) += hw/mthca/
obj-$(CONFIG_IPATH_CORE) += hw/ipath/ obj-$(CONFIG_INFINIBAND_IPATH) += hw/ipath/
obj-$(CONFIG_INFINIBAND_EHCA) += hw/ehca/ obj-$(CONFIG_INFINIBAND_EHCA) += hw/ehca/
obj-$(CONFIG_INFINIBAND_IPOIB) += ulp/ipoib/ obj-$(CONFIG_INFINIBAND_IPOIB) += ulp/ipoib/
obj-$(CONFIG_INFINIBAND_SRP) += ulp/srp/ obj-$(CONFIG_INFINIBAND_SRP) += ulp/srp/
......
config IPATH_CORE
tristate "QLogic InfiniPath Driver"
depends on 64BIT && PCI_MSI && NET
---help---
This is a low-level driver for QLogic InfiniPath host channel
adapters (HCAs) based on the HT-400 and PE-800 chips.
config INFINIBAND_IPATH config INFINIBAND_IPATH
tristate "QLogic InfiniPath Verbs Driver" tristate "QLogic InfiniPath Driver"
depends on IPATH_CORE && INFINIBAND depends on PCI_MSI && 64BIT && INFINIBAND
---help--- ---help---
This is a driver that provides InfiniBand verbs support for This is a driver for QLogic InfiniPath host channel adapters,
QLogic InfiniPath host channel adapters (HCAs). This including InfiniBand verbs support. This driver allows these
allows these devices to be used with both kernel upper level devices to be used with both kernel upper level protocols such
protocols such as IP-over-InfiniBand as well as with userspace as IP-over-InfiniBand as well as with userspace applications
applications (in conjunction with InfiniBand userspace access). (in conjunction with InfiniBand userspace access).
EXTRA_CFLAGS += -DIPATH_IDSTR='"QLogic kernel.org driver"' \ EXTRA_CFLAGS += -DIPATH_IDSTR='"QLogic kernel.org driver"' \
-DIPATH_KERN_TYPE=0 -DIPATH_KERN_TYPE=0
obj-$(CONFIG_IPATH_CORE) += ipath_core.o
obj-$(CONFIG_INFINIBAND_IPATH) += ib_ipath.o obj-$(CONFIG_INFINIBAND_IPATH) += ib_ipath.o
ipath_core-y := \ ib_ipath-y := \
ipath_cq.o \
ipath_diag.o \ ipath_diag.o \
ipath_driver.o \ ipath_driver.o \
ipath_eeprom.o \ ipath_eeprom.o \
...@@ -13,26 +13,23 @@ ipath_core-y := \ ...@@ -13,26 +13,23 @@ ipath_core-y := \
ipath_ht400.o \ ipath_ht400.o \
ipath_init_chip.o \ ipath_init_chip.o \
ipath_intr.o \ ipath_intr.o \
ipath_layer.o \
ipath_pe800.o \
ipath_stats.o \
ipath_sysfs.o \
ipath_user_pages.o
ipath_core-$(CONFIG_X86_64) += ipath_wc_x86_64.o
ipath_core-$(CONFIG_PPC64) += ipath_wc_ppc64.o
ib_ipath-y := \
ipath_cq.o \
ipath_keys.o \ ipath_keys.o \
ipath_layer.o \
ipath_mad.o \ ipath_mad.o \
ipath_mmap.o \ ipath_mmap.o \
ipath_mr.o \ ipath_mr.o \
ipath_pe800.o \
ipath_qp.o \ ipath_qp.o \
ipath_rc.o \ ipath_rc.o \
ipath_ruc.o \ ipath_ruc.o \
ipath_srq.o \ ipath_srq.o \
ipath_stats.o \
ipath_sysfs.o \
ipath_uc.o \ ipath_uc.o \
ipath_ud.o \ ipath_ud.o \
ipath_verbs.o \ ipath_user_pages.o \
ipath_verbs_mcast.o ipath_verbs_mcast.o \
ipath_verbs.o
ib_ipath-$(CONFIG_X86_64) += ipath_wc_x86_64.o
ib_ipath-$(CONFIG_PPC64) += ipath_wc_ppc64.o
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include "ipath_kernel.h" #include "ipath_kernel.h"
#include "ipath_layer.h" #include "ipath_layer.h"
#include "ipath_verbs.h"
#include "ipath_common.h" #include "ipath_common.h"
static void ipath_update_pio_bufs(struct ipath_devdata *); static void ipath_update_pio_bufs(struct ipath_devdata *);
...@@ -51,8 +52,6 @@ const char *ipath_get_unit_name(int unit) ...@@ -51,8 +52,6 @@ const char *ipath_get_unit_name(int unit)
return iname; return iname;
} }
EXPORT_SYMBOL_GPL(ipath_get_unit_name);
#define DRIVER_LOAD_MSG "QLogic " IPATH_DRV_NAME " loaded: " #define DRIVER_LOAD_MSG "QLogic " IPATH_DRV_NAME " loaded: "
#define PFX IPATH_DRV_NAME ": " #define PFX IPATH_DRV_NAME ": "
...@@ -510,6 +509,7 @@ static int __devinit ipath_init_one(struct pci_dev *pdev, ...@@ -510,6 +509,7 @@ static int __devinit ipath_init_one(struct pci_dev *pdev,
ipath_user_add(dd); ipath_user_add(dd);
ipath_diag_add(dd); ipath_diag_add(dd);
ipath_layer_add(dd); ipath_layer_add(dd);
ipath_register_ib_device(dd);
goto bail; goto bail;
...@@ -538,6 +538,7 @@ static void __devexit ipath_remove_one(struct pci_dev *pdev) ...@@ -538,6 +538,7 @@ static void __devexit ipath_remove_one(struct pci_dev *pdev)
return; return;
dd = pci_get_drvdata(pdev); dd = pci_get_drvdata(pdev);
ipath_unregister_ib_device(dd->verbs_dev);
ipath_layer_remove(dd); ipath_layer_remove(dd);
ipath_diag_remove(dd); ipath_diag_remove(dd);
ipath_user_remove(dd); ipath_user_remove(dd);
...@@ -978,12 +979,8 @@ void ipath_kreceive(struct ipath_devdata *dd) ...@@ -978,12 +979,8 @@ void ipath_kreceive(struct ipath_devdata *dd)
if (unlikely(eflags)) if (unlikely(eflags))
ipath_rcv_hdrerr(dd, eflags, l, etail, rc); ipath_rcv_hdrerr(dd, eflags, l, etail, rc);
else if (etype == RCVHQ_RCV_TYPE_NON_KD) { else if (etype == RCVHQ_RCV_TYPE_NON_KD) {
int ret = __ipath_verbs_rcv(dd, rc + 1, ipath_ib_rcv(dd->verbs_dev, rc + 1, ebuf,
ebuf, tlen); tlen);
if (ret == -ENODEV)
ipath_cdbg(VERBOSE,
"received IB packet, "
"not SMA (QP=%x)\n", qp);
if (dd->ipath_lli_counter) if (dd->ipath_lli_counter)
dd->ipath_lli_counter--; dd->ipath_lli_counter--;
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "ipath_kernel.h" #include "ipath_kernel.h"
#include "ipath_layer.h" #include "ipath_layer.h"
#include "ipath_verbs.h"
#include "ipath_common.h" #include "ipath_common.h"
/* These are all rcv-related errors which we want to count for stats */ /* These are all rcv-related errors which we want to count for stats */
...@@ -712,7 +713,7 @@ static void handle_layer_pioavail(struct ipath_devdata *dd) ...@@ -712,7 +713,7 @@ static void handle_layer_pioavail(struct ipath_devdata *dd)
if (ret > 0) if (ret > 0)
goto set; goto set;
ret = __ipath_verbs_piobufavail(dd); ret = ipath_ib_piobufavail(dd->verbs_dev);
if (ret > 0) if (ret > 0)
goto set; goto set;
......
...@@ -132,12 +132,6 @@ struct _ipath_layer { ...@@ -132,12 +132,6 @@ struct _ipath_layer {
void *l_arg; void *l_arg;
}; };
/* Verbs layer interface */
struct _verbs_layer {
void *l_arg;
struct timer_list l_timer;
};
struct ipath_devdata { struct ipath_devdata {
struct list_head ipath_list; struct list_head ipath_list;
...@@ -198,7 +192,8 @@ struct ipath_devdata { ...@@ -198,7 +192,8 @@ struct ipath_devdata {
void (*ipath_f_setextled)(struct ipath_devdata *, u64, u64); void (*ipath_f_setextled)(struct ipath_devdata *, u64, u64);
/* fill out chip-specific fields */ /* fill out chip-specific fields */
int (*ipath_f_get_base_info)(struct ipath_portdata *, void *); int (*ipath_f_get_base_info)(struct ipath_portdata *, void *);
struct _verbs_layer verbs_layer; struct ipath_ibdev *verbs_dev;
struct timer_list verbs_timer;
/* total dwords sent (summed from counter) */ /* total dwords sent (summed from counter) */
u64 ipath_sword; u64 ipath_sword;
/* total dwords rcvd (summed from counter) */ /* total dwords rcvd (summed from counter) */
...@@ -529,8 +524,6 @@ extern int ipath_layer_intr(struct ipath_devdata *, u32); ...@@ -529,8 +524,6 @@ extern int ipath_layer_intr(struct ipath_devdata *, u32);
extern int __ipath_layer_rcv(struct ipath_devdata *, void *, extern int __ipath_layer_rcv(struct ipath_devdata *, void *,
struct sk_buff *); struct sk_buff *);
extern int __ipath_layer_rcv_lid(struct ipath_devdata *, void *); extern int __ipath_layer_rcv_lid(struct ipath_devdata *, void *);
extern int __ipath_verbs_piobufavail(struct ipath_devdata *);
extern int __ipath_verbs_rcv(struct ipath_devdata *, void *, void *, u32);
void ipath_layer_add(struct ipath_devdata *); void ipath_layer_add(struct ipath_devdata *);
void ipath_layer_remove(struct ipath_devdata *); void ipath_layer_remove(struct ipath_devdata *);
......
This diff is collapsed.
...@@ -114,14 +114,7 @@ int ipath_layer_register(void *(*l_add)(int, struct ipath_devdata *), ...@@ -114,14 +114,7 @@ int ipath_layer_register(void *(*l_add)(int, struct ipath_devdata *),
struct sk_buff *), struct sk_buff *),
u16 rcv_opcode, u16 rcv_opcode,
int (*l_rcv_lid)(void *, void *)); int (*l_rcv_lid)(void *, void *));
int ipath_verbs_register(void *(*l_add)(int, struct ipath_devdata *),
void (*l_remove)(void *arg),
int (*l_piobufavail)(void *arg),
void (*l_rcv)(void *arg, void *rhdr,
void *data, u32 tlen),
void (*l_timer_cb)(void *arg));
void ipath_layer_unregister(void); void ipath_layer_unregister(void);
void ipath_verbs_unregister(void);
int ipath_layer_open(struct ipath_devdata *, u32 * pktmax); int ipath_layer_open(struct ipath_devdata *, u32 * pktmax);
u16 ipath_layer_get_lid(struct ipath_devdata *dd); u16 ipath_layer_get_lid(struct ipath_devdata *dd);
int ipath_layer_get_mac(struct ipath_devdata *dd, u8 *); int ipath_layer_get_mac(struct ipath_devdata *dd, u8 *);
...@@ -145,7 +138,6 @@ int ipath_layer_get_counters(struct ipath_devdata *dd, ...@@ -145,7 +138,6 @@ int ipath_layer_get_counters(struct ipath_devdata *dd,
int ipath_layer_want_buffer(struct ipath_devdata *dd); int ipath_layer_want_buffer(struct ipath_devdata *dd);
int ipath_layer_set_guid(struct ipath_devdata *, __be64 guid); int ipath_layer_set_guid(struct ipath_devdata *, __be64 guid);
__be64 ipath_layer_get_guid(struct ipath_devdata *); __be64 ipath_layer_get_guid(struct ipath_devdata *);
u32 ipath_layer_get_nguid(struct ipath_devdata *);
u32 ipath_layer_get_majrev(struct ipath_devdata *); u32 ipath_layer_get_majrev(struct ipath_devdata *);
u32 ipath_layer_get_minrev(struct ipath_devdata *); u32 ipath_layer_get_minrev(struct ipath_devdata *);
u32 ipath_layer_get_pcirev(struct ipath_devdata *); u32 ipath_layer_get_pcirev(struct ipath_devdata *);
......
...@@ -368,7 +368,7 @@ static void ipath_qp_rcv(struct ipath_ibdev *dev, ...@@ -368,7 +368,7 @@ static void ipath_qp_rcv(struct ipath_ibdev *dev,
} }
/** /**
* ipath_ib_rcv - process and incoming packet * ipath_ib_rcv - process an incoming packet
* @arg: the device pointer * @arg: the device pointer
* @rhdr: the header of the packet * @rhdr: the header of the packet
* @data: the packet data * @data: the packet data
...@@ -377,9 +377,9 @@ static void ipath_qp_rcv(struct ipath_ibdev *dev, ...@@ -377,9 +377,9 @@ static void ipath_qp_rcv(struct ipath_ibdev *dev,
* This is called from ipath_kreceive() to process an incoming packet at * This is called from ipath_kreceive() to process an incoming packet at
* interrupt level. Tlen is the length of the header + data + CRC in bytes. * interrupt level. Tlen is the length of the header + data + CRC in bytes.
*/ */
static void ipath_ib_rcv(void *arg, void *rhdr, void *data, u32 tlen) void ipath_ib_rcv(struct ipath_ibdev *dev, void *rhdr, void *data,
u32 tlen)
{ {
struct ipath_ibdev *dev = (struct ipath_ibdev *) arg;
struct ipath_ib_header *hdr = rhdr; struct ipath_ib_header *hdr = rhdr;
struct ipath_other_headers *ohdr; struct ipath_other_headers *ohdr;
struct ipath_qp *qp; struct ipath_qp *qp;
...@@ -468,9 +468,8 @@ bail:; ...@@ -468,9 +468,8 @@ bail:;
* This is called from ipath_do_rcv_timer() at interrupt level to check for * This is called from ipath_do_rcv_timer() at interrupt level to check for
* QPs which need retransmits and to collect performance numbers. * QPs which need retransmits and to collect performance numbers.
*/ */
static void ipath_ib_timer(void *arg) void ipath_ib_timer(struct ipath_ibdev *dev)
{ {
struct ipath_ibdev *dev = (struct ipath_ibdev *) arg;
struct ipath_qp *resend = NULL; struct ipath_qp *resend = NULL;
struct list_head *last; struct list_head *last;
struct ipath_qp *qp; struct ipath_qp *qp;
...@@ -564,9 +563,8 @@ static void ipath_ib_timer(void *arg) ...@@ -564,9 +563,8 @@ static void ipath_ib_timer(void *arg)
* QPs waiting for buffers (for now, just do a tasklet_hi_schedule and * QPs waiting for buffers (for now, just do a tasklet_hi_schedule and
* return zero). * return zero).
*/ */
static int ipath_ib_piobufavail(void *arg) int ipath_ib_piobufavail(struct ipath_ibdev *dev)
{ {
struct ipath_ibdev *dev = (struct ipath_ibdev *) arg;
struct ipath_qp *qp; struct ipath_qp *qp;
unsigned long flags; unsigned long flags;
...@@ -957,11 +955,10 @@ static int ipath_verbs_register_sysfs(struct ib_device *dev); ...@@ -957,11 +955,10 @@ static int ipath_verbs_register_sysfs(struct ib_device *dev);
/** /**
* ipath_register_ib_device - register our device with the infiniband core * ipath_register_ib_device - register our device with the infiniband core
* @unit: the device number to register
* @dd: the device data structure * @dd: the device data structure
* Return the allocated ipath_ibdev pointer or NULL on error. * Return the allocated ipath_ibdev pointer or NULL on error.
*/ */
static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd) int ipath_register_ib_device(struct ipath_devdata *dd)
{ {
struct ipath_layer_counters cntrs; struct ipath_layer_counters cntrs;
struct ipath_ibdev *idev; struct ipath_ibdev *idev;
...@@ -969,8 +966,10 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd) ...@@ -969,8 +966,10 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd)
int ret; int ret;
idev = (struct ipath_ibdev *)ib_alloc_device(sizeof *idev); idev = (struct ipath_ibdev *)ib_alloc_device(sizeof *idev);
if (idev == NULL) if (idev == NULL) {
ret = -ENOMEM;
goto bail; goto bail;
}
dev = &idev->ibdev; dev = &idev->ibdev;
...@@ -1047,7 +1046,7 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd) ...@@ -1047,7 +1046,7 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd)
if (!sys_image_guid) if (!sys_image_guid)
sys_image_guid = ipath_layer_get_guid(dd); sys_image_guid = ipath_layer_get_guid(dd);
idev->sys_image_guid = sys_image_guid; idev->sys_image_guid = sys_image_guid;
idev->ib_unit = unit; idev->ib_unit = dd->ipath_unit;
idev->dd = dd; idev->dd = dd;
strlcpy(dev->name, "ipath%d", IB_DEVICE_NAME_MAX); strlcpy(dev->name, "ipath%d", IB_DEVICE_NAME_MAX);
...@@ -1153,16 +1152,16 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd) ...@@ -1153,16 +1152,16 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd)
err_qp: err_qp:
ib_dealloc_device(dev); ib_dealloc_device(dev);
_VERBS_ERROR("ib_ipath%d cannot register verbs (%d)!\n", _VERBS_ERROR("ib_ipath%d cannot register verbs (%d)!\n",
unit, -ret); dd->ipath_unit, -ret);
idev = NULL; idev = NULL;
bail: bail:
return idev; dd->verbs_dev = idev;
return ret;
} }
static void ipath_unregister_ib_device(void *arg) void ipath_unregister_ib_device(struct ipath_ibdev *dev)
{ {
struct ipath_ibdev *dev = (struct ipath_ibdev *) arg;
struct ib_device *ibdev = &dev->ibdev; struct ib_device *ibdev = &dev->ibdev;
ipath_layer_disable_timer(dev->dd); ipath_layer_disable_timer(dev->dd);
...@@ -1193,19 +1192,6 @@ static void ipath_unregister_ib_device(void *arg) ...@@ -1193,19 +1192,6 @@ static void ipath_unregister_ib_device(void *arg)
ib_dealloc_device(ibdev); ib_dealloc_device(ibdev);
} }
static int __init ipath_verbs_init(void)
{
return ipath_verbs_register(ipath_register_ib_device,
ipath_unregister_ib_device,
ipath_ib_piobufavail, ipath_ib_rcv,
ipath_ib_timer);
}
static void __exit ipath_verbs_cleanup(void)
{
ipath_verbs_unregister();
}
static ssize_t show_rev(struct class_device *cdev, char *buf) static ssize_t show_rev(struct class_device *cdev, char *buf)
{ {
struct ipath_ibdev *dev = struct ipath_ibdev *dev =
...@@ -1297,6 +1283,3 @@ static int ipath_verbs_register_sysfs(struct ib_device *dev) ...@@ -1297,6 +1283,3 @@ static int ipath_verbs_register_sysfs(struct ib_device *dev)
bail: bail:
return ret; return ret;
} }
module_init(ipath_verbs_init);
module_exit(ipath_verbs_cleanup);
...@@ -711,6 +711,16 @@ int ipath_make_rc_req(struct ipath_qp *qp, struct ipath_other_headers *ohdr, ...@@ -711,6 +711,16 @@ int ipath_make_rc_req(struct ipath_qp *qp, struct ipath_other_headers *ohdr,
int ipath_make_uc_req(struct ipath_qp *qp, struct ipath_other_headers *ohdr, int ipath_make_uc_req(struct ipath_qp *qp, struct ipath_other_headers *ohdr,
u32 pmtu, u32 *bth0p, u32 *bth2p); u32 pmtu, u32 *bth0p, u32 *bth2p);
int ipath_register_ib_device(struct ipath_devdata *);
void ipath_unregister_ib_device(struct ipath_ibdev *);
void ipath_ib_rcv(struct ipath_ibdev *, void *, void *, u32);
int ipath_ib_piobufavail(struct ipath_ibdev *);
void ipath_ib_timer(struct ipath_ibdev *);
extern const enum ib_wc_opcode ib_ipath_wc_opcode[]; extern const enum ib_wc_opcode ib_ipath_wc_opcode[];
extern const u8 ipath_cvt_physportstate[]; extern const u8 ipath_cvt_physportstate[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment