linux/drivers/net/wireless/mediatek/mt76/mt7603/pci.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: ISC */
   2
   3#include <linux/kernel.h>
   4#include <linux/module.h>
   5#include <linux/pci.h>
   6
   7#include "mt7603.h"
   8
   9static const struct pci_device_id mt76pci_device_table[] = {
  10        { PCI_DEVICE(0x14c3, 0x7603) },
  11        { },
  12};
  13
  14static int
  15mt76pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
  16{
  17        struct mt7603_dev *dev;
  18        struct mt76_dev *mdev;
  19        int ret;
  20
  21        ret = pcim_enable_device(pdev);
  22        if (ret)
  23                return ret;
  24
  25        ret = pcim_iomap_regions(pdev, BIT(0), pci_name(pdev));
  26        if (ret)
  27                return ret;
  28
  29        pci_set_master(pdev);
  30
  31        ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
  32        if (ret)
  33                return ret;
  34
  35        mdev = mt76_alloc_device(&pdev->dev, sizeof(*dev), &mt7603_ops,
  36                                 &mt7603_drv_ops);
  37        if (!mdev)
  38                return -ENOMEM;
  39
  40        dev = container_of(mdev, struct mt7603_dev, mt76);
  41        mt76_mmio_init(mdev, pcim_iomap_table(pdev)[0]);
  42
  43        mdev->rev = (mt76_rr(dev, MT_HW_CHIPID) << 16) |
  44                    (mt76_rr(dev, MT_HW_REV) & 0xff);
  45        dev_info(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
  46
  47        ret = devm_request_irq(mdev->dev, pdev->irq, mt7603_irq_handler,
  48                               IRQF_SHARED, KBUILD_MODNAME, dev);
  49        if (ret)
  50                goto error;
  51
  52        ret = mt7603_register_device(dev);
  53        if (ret)
  54                goto error;
  55
  56        return 0;
  57error:
  58        ieee80211_free_hw(mt76_hw(dev));
  59        return ret;
  60}
  61
  62static void
  63mt76pci_remove(struct pci_dev *pdev)
  64{
  65        struct mt76_dev *mdev = pci_get_drvdata(pdev);
  66        struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
  67
  68        mt7603_unregister_device(dev);
  69}
  70
  71MODULE_DEVICE_TABLE(pci, mt76pci_device_table);
  72MODULE_FIRMWARE(MT7603_FIRMWARE_E1);
  73MODULE_FIRMWARE(MT7603_FIRMWARE_E2);
  74
  75struct pci_driver mt7603_pci_driver = {
  76        .name           = KBUILD_MODNAME,
  77        .id_table       = mt76pci_device_table,
  78        .probe          = mt76pci_probe,
  79        .remove         = mt76pci_remove,
  80};
  81