bnxt_re related part looks good to me. Acked-by: Devesh Sharma <devesh.sharma@xxxxxxxxxxxx> On Wed, Sep 20, 2017 at 2:48 AM, Jason Gunthorpe <jgunthorpe@xxxxxxxxxxxxxxxxxxxx> wrote: > Migrate all trivial cases, these are all just copies of a few variations of > the table scan. > > Signed-off-by: Jason Gunthorpe <jgunthorpe@xxxxxxxxxxxxxxxxxxxx> > --- > providers/bnxt_re/main.c | 40 ++++--------------------------- > providers/hfi1verbs/hfiverbs.c | 39 ++++-------------------------- > providers/i40iw/i40iw_umain.c | 49 ++++---------------------------------- > providers/ipathverbs/ipathverbs.c | 39 ++++-------------------------- > providers/mlx4/mlx4.c | 38 ++++------------------------- > providers/mlx5/mlx5.c | 38 ++++------------------------- > providers/mthca/mthca.c | 47 ++++++------------------------------ > providers/nes/nes_umain.c | 46 +++++------------------------------ > providers/ocrdma/ocrdma_main.c | 43 +++++++-------------------------- > providers/qedr/qelr_main.c | 41 ++++--------------------------- > providers/vmw_pvrdma/pvrdma_main.c | 30 ++++++----------------- > 11 files changed, 61 insertions(+), 389 deletions(-) > > diff --git a/providers/bnxt_re/main.c b/providers/bnxt_re/main.c > index c83baacbb9f749..998c9fe3313389 100644 > --- a/providers/bnxt_re/main.c > +++ b/providers/bnxt_re/main.c > @@ -52,15 +52,8 @@ > > #define PCI_VENDOR_ID_BROADCOM 0x14E4 > > -#define CNA(v, d) \ > - { .vendor = PCI_VENDOR_ID_##v, \ > - .device = d } > - > -static const struct { > - unsigned int vendor; > - unsigned int device; > -} cna_table[] = { > - CNA(BROADCOM, 0x1614), /* BCM57454 */ > +#define CNA(v, d) VERBS_PCI_MATCH(PCI_VENDOR_ID_##v, d, NULL) > +static const struct verbs_match_ent cna_table[] = { > CNA(BROADCOM, 0x16C0), /* BCM57417 NPAR */ > CNA(BROADCOM, 0x16CE), /* BMC57311 */ > CNA(BROADCOM, 0x16CF), /* BMC57312 */ > @@ -78,7 +71,8 @@ static const struct { > CNA(BROADCOM, 0x16EB), /* BCM57412 NPAR */ > CNA(BROADCOM, 0x16F0), /* BCM58730 */ > CNA(BROADCOM, 0x16F1), /* BCM57452 */ > - CNA(BROADCOM, 0xD802) /* BCM58802 */ > + CNA(BROADCOM, 0xD802), /* BCM58802 */ > + {} > }; > > static struct ibv_context_ops bnxt_re_cntx_ops = { > @@ -174,30 +168,6 @@ static void bnxt_re_uninit_context(struct verbs_device *vdev, > } > } > > -static bool bnxt_re_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[10]; > - unsigned int vendor, device; > - int i; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof(value)) < 0) > - return false; > - vendor = strtol(value, NULL, 16); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof(value)) < 0) > - return false; > - device = strtol(value, NULL, 16); > - > - for (i = 0; i < sizeof(cna_table) / sizeof(cna_table[0]); ++i) > - if (vendor == cna_table[i].vendor && > - device == cna_table[i].device) > - return true; > - return false; > -} > - > static struct verbs_device * > bnxt_re_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > @@ -218,7 +188,7 @@ static const struct verbs_device_ops bnxt_re_dev_ops = { > .name = "bnxt_re", > .match_min_abi_version = BNXT_RE_ABI_VERSION, > .match_max_abi_version = BNXT_RE_ABI_VERSION, > - .match_device = bnxt_re_device_match, > + .match_table = cna_table, > .alloc_device = bnxt_re_device_alloc, > .init_context = bnxt_re_init_context, > .uninit_context = bnxt_re_uninit_context, > diff --git a/providers/hfi1verbs/hfiverbs.c b/providers/hfi1verbs/hfiverbs.c > index 5bb436593517e1..7f8f5714db1630 100644 > --- a/providers/hfi1verbs/hfiverbs.c > +++ b/providers/hfi1verbs/hfiverbs.c > @@ -77,16 +77,12 @@ > #define PCI_DEVICE_ID_HFI_INTEL1 0x24f1 > #endif > > -#define HFI(v, d) \ > - { .vendor = PCI_VENDOR_ID_##v, \ > - .device = PCI_DEVICE_ID_HFI_##d } > - > -static struct { > - unsigned vendor; > - unsigned device; > -} hca_table[] = { > +#define HFI(v, d) \ > + VERBS_PCI_MATCH(PCI_VENDOR_ID_##v, PCI_DEVICE_ID_HFI_##d, NULL) > +static const struct verbs_match_ent hca_table[] = { > HFI(INTEL, INTEL0), > HFI(INTEL, INTEL1), > + {} > }; > > static struct ibv_context_ops hfi1_ctx_ops = { > @@ -180,31 +176,6 @@ static void hf11_uninit_device(struct verbs_device *verbs_device) > free(dev); > } > > -static bool hfi1_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[8]; > - unsigned vendor, device; > - int i; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof value) < 0) > - return false; > - sscanf(value, "%i", &vendor); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof value) < 0) > - return false; > - sscanf(value, "%i", &device); > - > - for (i = 0; i < sizeof hca_table / sizeof hca_table[0]; ++i) > - if (vendor == hca_table[i].vendor && > - device == hca_table[i].device) > - return true; > - > - return false; > -} > - > static struct verbs_device *hfi1_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > struct hfi1_device *dev; > @@ -222,7 +193,7 @@ static const struct verbs_device_ops hfi1_dev_ops = { > .name = "hfi1verbs", > .match_min_abi_version = 0, > .match_max_abi_version = INT_MAX, > - .match_device = hfi1_device_match, > + .match_table = hca_table, > .alloc_device = hfi1_device_alloc, > .uninit_device = hf11_uninit_device, > .alloc_context = hfi1_alloc_context, > diff --git a/providers/i40iw/i40iw_umain.c b/providers/i40iw/i40iw_umain.c > index bcba6158e60e40..61c2a92dd6734c 100644 > --- a/providers/i40iw/i40iw_umain.c > +++ b/providers/i40iw/i40iw_umain.c > @@ -50,16 +50,8 @@ > #include <sys/stat.h> > #include <fcntl.h> > > -#define INTEL_HCA(v, d, t) \ > - { .vendor = v, \ > - .device = d, \ > - .type = INTEL_ ## t } > - > -static struct hca_ent { > - unsigned int vendor; > - unsigned int device; > - enum i40iw_uhca_type type; > -} hca_table[] = { > +#define INTEL_HCA(v, d, t) VERBS_PCI_MATCH(v, d, (void *)(INTEL_##t)) > +static const struct verbs_match_ent hca_table[] = { > #ifdef I40E_DEV_ID_X722_A0 > INTEL_HCA(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_X722_A0, i40iw), > #endif > @@ -96,6 +88,7 @@ static struct hca_ent { > #ifdef I40E_DEV_ID_X722_FPGA_VF > INTEL_HCA(I40E_INTEL_VENDOR_ID, I40E_DEV_ID_X722_FPGA_VF, i40iw), > #endif > + {} > }; > > static struct ibv_context *i40iw_ualloc_context(struct ibv_device *, int); > @@ -215,48 +208,16 @@ static void i40iw_uninit_device(struct verbs_device *verbs_device) > free(dev); > } > > -/** > - * i40iw_driver_init - create device struct and provide callback routines for user context > - * @uverbs_sys_path: sys path > - * @abi_version: not used > - */ > -static bool i40iw_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[16]; > - unsigned int vendor, device; > - int i; > - > - if ((ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", value, sizeof(value)) < 0) || > - (sscanf(value, "%i", &vendor) != 1)) > - return false; > - > - if ((ibv_read_sysfs_file(uverbs_sys_path, "device/device", value, sizeof(value)) < 0) || > - (sscanf(value, "%i", &device) != 1)) > - return false; > - > - for (i = 0; i < sizeof(hca_table) / sizeof(hca_table[0]); ++i) { > - if (vendor == hca_table[i].vendor && > - device == hca_table[i].device) { > - sysfs_dev->provider_data = &hca_table[i]; > - return true; > - } > - } > - > - return false; > -} > - > static struct verbs_device * > i40iw_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > struct i40iw_udevice *dev; > - struct hca_ent *hca_ent = sysfs_dev->provider_data; > > dev = calloc(1, sizeof(*dev)); > if (!dev) > return NULL; > > - dev->hca_type = hca_ent->type; > + dev->hca_type = (uintptr_t)sysfs_dev->match->driver_data; > dev->page_size = I40IW_HW_PAGE_SIZE; > return &dev->ibv_dev; > } > @@ -265,7 +226,7 @@ static const struct verbs_device_ops i40iw_udev_ops = { > .name = "i40iw", > .match_min_abi_version = 0, > .match_max_abi_version = INT_MAX, > - .match_device = i40iw_device_match, > + .match_table = hca_table, > .alloc_device = i40iw_device_alloc, > .uninit_device = i40iw_uninit_device, > .alloc_context = i40iw_ualloc_context, > diff --git a/providers/ipathverbs/ipathverbs.c b/providers/ipathverbs/ipathverbs.c > index 3c141263d8ff86..449abb0489955a 100644 > --- a/providers/ipathverbs/ipathverbs.c > +++ b/providers/ipathverbs/ipathverbs.c > @@ -73,19 +73,15 @@ > #define PCI_DEVICE_ID_INFINIPATH_7322 0x7322 > #endif > > -#define HCA(v, d) \ > - { .vendor = PCI_VENDOR_ID_##v, \ > - .device = PCI_DEVICE_ID_INFINIPATH_##d } > - > -static struct { > - unsigned vendor; > - unsigned device; > -} hca_table[] = { > +#define HCA(v, d) \ > + VERBS_PCI_MATCH(PCI_VENDOR_ID_##v, PCI_DEVICE_ID_INFINIPATH_##d, NULL) > +static const struct verbs_match_ent hca_table[] = { > HCA(PATHSCALE, HT), > HCA(PATHSCALE, PE800), > HCA(QLOGIC, 6220), > HCA(QLOGIC, 7220), > HCA(QLOGIC, 7322), > + {} > }; > > static struct ibv_context_ops ipath_ctx_ops = { > @@ -179,31 +175,6 @@ static void ipath_uninit_device(struct verbs_device *verbs_device) > free(dev); > } > > -static bool ipath_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[8]; > - unsigned vendor, device; > - int i; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof value) < 0) > - return false; > - sscanf(value, "%i", &vendor); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof value) < 0) > - return false; > - sscanf(value, "%i", &device); > - > - for (i = 0; i < sizeof hca_table / sizeof hca_table[0]; ++i) > - if (vendor == hca_table[i].vendor && > - device == hca_table[i].device) > - return true; > - > - return false; > -} > - > static struct verbs_device * > ipath_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > @@ -222,7 +193,7 @@ static const struct verbs_device_ops ipath_dev_ops = { > .name = "ipathverbs", > .match_min_abi_version = 0, > .match_max_abi_version = INT_MAX, > - .match_device = ipath_device_match, > + .match_table = hca_table, > .alloc_device = ipath_device_alloc, > .uninit_device = ipath_uninit_device, > .alloc_context = ipath_alloc_context, > diff --git a/providers/mlx4/mlx4.c b/providers/mlx4/mlx4.c > index b52684a563b495..6de0bee559e79f 100644 > --- a/providers/mlx4/mlx4.c > +++ b/providers/mlx4/mlx4.c > @@ -49,14 +49,8 @@ int mlx4_cleanup_upon_device_fatal = 0; > #define PCI_VENDOR_ID_MELLANOX 0x15b3 > #endif > > -#define HCA(v, d) \ > - { .vendor = PCI_VENDOR_ID_##v, \ > - .device = d } > - > -static struct { > - unsigned vendor; > - unsigned device; > -} hca_table[] = { > +#define HCA(v, d) VERBS_PCI_MATCH(PCI_VENDOR_ID_##v, d, NULL) > +static const struct verbs_match_ent hca_table[] = { > HCA(MELLANOX, 0x6340), /* MT25408 "Hermon" SDR */ > HCA(MELLANOX, 0x634a), /* MT25408 "Hermon" DDR */ > HCA(MELLANOX, 0x6354), /* MT25408 "Hermon" QDR */ > @@ -84,6 +78,7 @@ static struct { > HCA(MELLANOX, 0x100e), /* MT27551 Family */ > HCA(MELLANOX, 0x100f), /* MT27560 Family */ > HCA(MELLANOX, 0x1010), /* MT27561 Family */ > + {} > }; > > static struct ibv_context_ops mlx4_ctx_ops = { > @@ -286,31 +281,6 @@ static void mlx4_uninit_device(struct verbs_device *verbs_device) > free(dev); > } > > -static bool mlx4_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[8]; > - unsigned vendor, device; > - int i; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof value) < 0) > - return false; > - vendor = strtol(value, NULL, 16); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof value) < 0) > - return false; > - device = strtol(value, NULL, 16); > - > - for (i = 0; i < sizeof hca_table / sizeof hca_table[0]; ++i) > - if (vendor == hca_table[i].vendor && > - device == hca_table[i].device) > - return true; > - > - return false; > -} > - > static struct verbs_device *mlx4_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > struct mlx4_device *dev; > @@ -333,7 +303,7 @@ static const struct verbs_device_ops mlx4_dev_ops = { > .name = "mlx4", > .match_min_abi_version = MLX4_UVERBS_MIN_ABI_VERSION, > .match_max_abi_version = MLX4_UVERBS_MAX_ABI_VERSION, > - .match_device = mlx4_device_match, > + .match_table = hca_table, > .alloc_device = mlx4_device_alloc, > .uninit_device = mlx4_uninit_device, > .init_context = mlx4_init_context, > diff --git a/providers/mlx5/mlx5.c b/providers/mlx5/mlx5.c > index 44cfd97b73cbbb..15f258dfca7387 100644 > --- a/providers/mlx5/mlx5.c > +++ b/providers/mlx5/mlx5.c > @@ -59,15 +59,8 @@ > #define CPU_EQUAL(x, y) 1 > #endif > > - > -#define HCA(v, d) \ > - { .vendor = PCI_VENDOR_ID_##v, \ > - .device = d } > - > -static struct { > - unsigned vendor; > - unsigned device; > -} hca_table[] = { > +#define HCA(v, d) VERBS_PCI_MATCH(PCI_VENDOR_ID_##v, d, NULL) > +static const struct verbs_match_ent hca_table[] = { > HCA(MELLANOX, 0x1011), /* MT4113 Connect-IB */ > HCA(MELLANOX, 0x1012), /* Connect-IB Virtual Function */ > HCA(MELLANOX, 0x1013), /* ConnectX-4 */ > @@ -82,6 +75,7 @@ static struct { > HCA(MELLANOX, 0x101c), /* ConnectX-6 VF */ > HCA(MELLANOX, 0xa2d2), /* BlueField integrated ConnectX-5 network controller */ > HCA(MELLANOX, 0xa2d3), /* BlueField integrated ConnectX-5 network controller VF */ > + {} > }; > > uint32_t mlx5_debug_mask = 0; > @@ -1026,30 +1020,6 @@ static void mlx5_uninit_device(struct verbs_device *verbs_device) > free(dev); > } > > -static bool mlx5_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[8]; > - unsigned vendor, device; > - int i; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof value) < 0) > - return false; > - sscanf(value, "%i", &vendor); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof value) < 0) > - return false; > - sscanf(value, "%i", &device); > - > - for (i = 0; i < sizeof hca_table / sizeof hca_table[0]; ++i) > - if (vendor == hca_table[i].vendor && > - device == hca_table[i].device) > - return true; > - return false; > -} > - > static struct verbs_device *mlx5_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > struct mlx5_device *dev; > @@ -1072,7 +1042,7 @@ static const struct verbs_device_ops mlx5_dev_ops = { > .name = "mlx5", > .match_min_abi_version = MLX5_UVERBS_MIN_ABI_VERSION, > .match_max_abi_version = MLX5_UVERBS_MAX_ABI_VERSION, > - .match_device = mlx5_device_match, > + .match_table = hca_table, > .alloc_device = mlx5_device_alloc, > .uninit_device = mlx5_uninit_device, > .init_context = mlx5_init_context, > diff --git a/providers/mthca/mthca.c b/providers/mthca/mthca.c > index 521e5b9afe4f2b..511b8d5139af9c 100644 > --- a/providers/mthca/mthca.c > +++ b/providers/mthca/mthca.c > @@ -72,16 +72,10 @@ > #define PCI_VENDOR_ID_TOPSPIN 0x1867 > #endif > > -#define HCA(v, d, t) \ > - { .vendor = PCI_VENDOR_ID_##v, \ > - .device = PCI_DEVICE_ID_MELLANOX_##d, \ > - .type = MTHCA_##t } > - > -static struct hca_ent { > - unsigned vendor; > - unsigned device; > - enum mthca_hca_type type; > -} hca_table[] = { > +#define HCA(v, d, t) \ > + VERBS_PCI_MATCH(PCI_VENDOR_ID_##v, PCI_DEVICE_ID_MELLANOX_##d, \ > + (void *)(MTHCA_##t)) > +static const struct verbs_match_ent hca_table[] = { > HCA(MELLANOX, TAVOR, TAVOR), > HCA(MELLANOX, ARBEL_COMPAT, TAVOR), > HCA(MELLANOX, ARBEL, ARBEL), > @@ -92,6 +86,7 @@ static struct hca_ent { > HCA(TOPSPIN, ARBEL, ARBEL), > HCA(TOPSPIN, SINAI_OLD, ARBEL), > HCA(TOPSPIN, SINAI, ARBEL), > + {} > }; > > static struct ibv_context_ops mthca_ctx_ops = { > @@ -216,44 +211,16 @@ static void mthca_uninit_device(struct verbs_device *verbs_device) > free(dev); > } > > -static bool mthca_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[8]; > - unsigned vendor, device; > - int i; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof value) < 0) > - return false; > - sscanf(value, "%i", &vendor); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof value) < 0) > - return false; > - sscanf(value, "%i", &device); > - > - for (i = 0; i < sizeof hca_table / sizeof hca_table[0]; ++i) > - if (vendor == hca_table[i].vendor && > - device == hca_table[i].device) { > - sysfs_dev->provider_data = &hca_table[i]; > - return true; > - } > - > - return false; > -} > - > static struct verbs_device * > mthca_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > struct mthca_device *dev; > - struct hca_ent *hca_ent = sysfs_dev->provider_data; > > dev = calloc(1, sizeof(*dev)); > if (!dev) > return NULL; > > - dev->hca_type = hca_ent->type; > + dev->hca_type = (uintptr_t)sysfs_dev->match->driver_data; > dev->page_size = sysconf(_SC_PAGESIZE); > > return &dev->ibv_dev; > @@ -263,7 +230,7 @@ static const struct verbs_device_ops mthca_dev_ops = { > .name = "mthca", > .match_min_abi_version = 0, > .match_max_abi_version = MTHCA_UVERBS_ABI_VERSION, > - .match_device = mthca_device_match, > + .match_table = hca_table, > .alloc_device = mthca_device_alloc, > .uninit_device = mthca_uninit_device, > .alloc_context = mthca_alloc_context, > diff --git a/providers/nes/nes_umain.c b/providers/nes/nes_umain.c > index fc021a9196b6ad..fd3d19def399b2 100644 > --- a/providers/nes/nes_umain.c > +++ b/providers/nes/nes_umain.c > @@ -55,18 +55,12 @@ long int page_size; > #define PCI_VENDOR_ID_NETEFFECT 0x1678 > #endif > > -#define HCA(v, d, t) \ > - { .vendor = PCI_VENDOR_ID_##v, \ > - .device = d, \ > - .type = NETEFFECT_##t } > - > -static struct hca_ent { > - unsigned vendor; > - unsigned device; > - enum nes_uhca_type type; > -} hca_table[] = { > +#define HCA(v, d, t) \ > + VERBS_PCI_MATCH(PCI_VENDOR_ID_##v, d, (void *)(NETEFFECT_##t)) > +static const struct verbs_match_ent hca_table[] = { > HCA(NETEFFECT, 0x0100, nes), > HCA(NETEFFECT, 0x0110, nes), > + {}, > }; > > static struct ibv_context *nes_ualloc_context(struct ibv_device *, int); > @@ -191,38 +185,10 @@ static void nes_uninit_device(struct verbs_device *verbs_device) > free(dev); > } > > -static bool nes_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[16]; > - unsigned vendor, device; > - int i; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof(value)) < 0) > - return false; > - sscanf(value, "%i", &vendor); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof(value)) < 0) > - return false; > - sscanf(value, "%i", &device); > - > - for (i = 0; i < sizeof hca_table / sizeof hca_table[0]; ++i) > - if (vendor == hca_table[i].vendor && > - device == hca_table[i].device) { > - sysfs_dev->provider_data = &hca_table[i]; > - return true; > - } > - > - return false; > -} > - > static struct verbs_device * > nes_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > struct nes_udevice *dev; > - struct hca_ent *hca_ent = sysfs_dev->provider_data; > char value[16]; > > if (ibv_read_sysfs_file("/sys/module/iw_nes", "parameters/debug_level", > @@ -237,7 +203,7 @@ nes_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > if (!dev) > return NULL; > > - dev->hca_type = hca_ent->type; > + dev->hca_type = (uintptr_t)sysfs_dev->match->driver_data; > dev->page_size = sysconf(_SC_PAGESIZE); > > nes_debug(NES_DBG_INIT, "libnes initialized\n"); > @@ -249,7 +215,7 @@ static const struct verbs_device_ops nes_udev_ops = { > .name = "nes", > .match_min_abi_version = 0, > .match_max_abi_version = INT_MAX, > - .match_device = nes_device_match, > + .match_table = hca_table, > .alloc_device = nes_device_alloc, > .uninit_device = nes_uninit_device, > .alloc_context = nes_ualloc_context, > diff --git a/providers/ocrdma/ocrdma_main.c b/providers/ocrdma/ocrdma_main.c > index f08a49fb73e021..92a5b8a5d1c86c 100644 > --- a/providers/ocrdma/ocrdma_main.c > +++ b/providers/ocrdma/ocrdma_main.c > @@ -55,15 +55,13 @@ > #define PCI_DEVICE_ID_EMULEX_GEN2 0x720 > #define PCI_DEVICE_ID_EMULEX_GEN2_VF 0x728 > > -#define UCNA(v, d) \ > - { .vendor = PCI_VENDOR_ID_##v, \ > - .device = PCI_DEVICE_ID_EMULEX_##d } > - > -static struct { > - unsigned vendor; > - unsigned device; > -} ucna_table[] = { > - UCNA(EMULEX, GEN1), UCNA(EMULEX, GEN2), UCNA(EMULEX, GEN2_VF) > +#define UCNA(v, d) \ > + VERBS_PCI_MATCH(PCI_VENDOR_ID_##v, PCI_DEVICE_ID_EMULEX_##d, NULL) > +static const struct verbs_match_ent ucna_table[] = { > + UCNA(EMULEX, GEN1), > + UCNA(EMULEX, GEN2), > + UCNA(EMULEX, GEN2_VF), > + {} > }; > > static struct ibv_context *ocrdma_alloc_context(struct ibv_device *, int); > @@ -168,31 +166,6 @@ static void ocrdma_free_context(struct ibv_context *ibctx) > free(ctx); > } > > -static bool ocrdma_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[16]; > - unsigned vendor, device; > - int i; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof(value)) < 0) > - return false; > - sscanf(value, "%i", &vendor); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof(value)) < 0) > - return false; > - sscanf(value, "%i", &device); > - > - for (i = 0; i < sizeof ucna_table / sizeof ucna_table[0]; ++i) { > - if (vendor == ucna_table[i].vendor && > - device == ucna_table[i].device) > - return true; > - } > - return false; > -} > - > static struct verbs_device * > ocrdma_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > @@ -218,7 +191,7 @@ static const struct verbs_device_ops ocrdma_dev_ops = { > .name = "ocrdma", > .match_min_abi_version = OCRDMA_ABI_VERSION, > .match_max_abi_version = OCRDMA_ABI_VERSION, > - .match_device = ocrdma_device_match, > + .match_table = ucna_table, > .alloc_device = ocrdma_device_alloc, > .uninit_device = ocrdma_uninit_device, > .alloc_context = ocrdma_alloc_context, > diff --git a/providers/qedr/qelr_main.c b/providers/qedr/qelr_main.c > index 4d1b92f40a413a..1297e8e16acee5 100644 > --- a/providers/qedr/qelr_main.c > +++ b/providers/qedr/qelr_main.c > @@ -64,14 +64,9 @@ > uint32_t qelr_dp_level; > uint32_t qelr_dp_module; > > -#define QHCA(d) \ > - { .vendor = PCI_VENDOR_ID_QLOGIC, \ > - .device = PCI_DEVICE_ID_QLOGIC_##d } > - > -static const struct { > - unsigned int vendor; > - unsigned int device; > -} hca_table[] = { > +#define QHCA(d) \ > + VERBS_PCI_MATCH(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_##d, NULL) > +static const struct verbs_match_ent hca_table[] = { > QHCA(57980S), > QHCA(57980S_40), > QHCA(57980S_10), > @@ -82,6 +77,7 @@ static const struct { > QHCA(57980S_IOV), > QHCA(AH), > QHCA(AH_IOV), > + {} > }; > > static struct ibv_context *qelr_alloc_context(struct ibv_device *, int); > @@ -227,33 +223,6 @@ static void qelr_free_context(struct ibv_context *ibctx) > free(ctx); > } > > -static bool qedr_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[16]; > - unsigned int vendor, device; > - int i; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof(value)) < 0) > - return false; > - > - sscanf(value, "%i", &vendor); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof(value)) < 0) > - return false; > - > - sscanf(value, "%i", &device); > - > - for (i = 0; i < sizeof(hca_table) / sizeof(hca_table[0]); ++i) > - if (vendor == hca_table[i].vendor && > - device == hca_table[i].device) > - return true; > - > - return false; > -} > - > static struct verbs_device *qedr_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > struct qelr_device *dev; > @@ -269,7 +238,7 @@ static const struct verbs_device_ops qelr_dev_ops = { > .name = "qelr", > .match_min_abi_version = QELR_ABI_VERSION, > .match_max_abi_version = QELR_ABI_VERSION, > - .match_device = qedr_device_match, > + .match_table = hca_table, > .alloc_device = qedr_device_alloc, > .uninit_device = qelr_uninit_device, > .alloc_context = qelr_alloc_context, > diff --git a/providers/vmw_pvrdma/pvrdma_main.c b/providers/vmw_pvrdma/pvrdma_main.c > index 9bcf2ddd172afb..0826629c081018 100644 > --- a/providers/vmw_pvrdma/pvrdma_main.c > +++ b/providers/vmw_pvrdma/pvrdma_main.c > @@ -169,28 +169,6 @@ static void pvrdma_uninit_device(struct verbs_device *verbs_device) > free(dev); > } > > -static bool pvrdma_device_match(struct verbs_sysfs_dev *sysfs_dev) > -{ > - const char *uverbs_sys_path = sysfs_dev->sysfs_path; > - char value[8]; > - unsigned int vendor_id, device_id; > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/vendor", > - value, sizeof(value)) < 0) > - return false; > - vendor_id = strtol(value, NULL, 16); > - > - if (ibv_read_sysfs_file(uverbs_sys_path, "device/device", > - value, sizeof(value)) < 0) > - return false; > - device_id = strtol(value, NULL, 16); > - > - if (vendor_id != PCI_VENDOR_ID_VMWARE || > - device_id != PCI_DEVICE_ID_VMWARE_PVRDMA) > - return false; > - return true; > -} > - > static struct verbs_device * > pvrdma_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > { > @@ -206,11 +184,17 @@ pvrdma_device_alloc(struct verbs_sysfs_dev *sysfs_dev) > return &dev->ibv_dev; > } > > +static const struct verbs_match_ent hca_table[] = { > + VERBS_PCI_MATCH(PCI_VENDOR_ID_VMWARE, PCI_DEVICE_ID_VMWARE_PVRDMA, > + NULL), > + {} > +}; > + > static const struct verbs_device_ops pvrdma_dev_ops = { > .name = "pvrdma", > .match_min_abi_version = PVRDMA_UVERBS_ABI_VERSION, > .match_max_abi_version = PVRDMA_UVERBS_ABI_VERSION, > - .match_device = pvrdma_device_match, > + .match_table = hca_table, > .alloc_device = pvrdma_device_alloc, > .uninit_device = pvrdma_uninit_device, > .alloc_context = pvrdma_alloc_context, > -- > 2.7.4 > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html