1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2020, Intel Corporation
5 #include <linux/clk-provider.h>
8 #include "dwmac-intel.h"
12 struct intel_priv_data
{
13 int mdio_adhoc_addr
; /* mdio address for serdes & etc */
16 /* This struct is used to associate PCI Function of MAC controller on a board,
17 * discovered via DMI, with the address of PHY connected to the MAC. The
18 * negative value of the address means that MAC controller is not connected
21 struct stmmac_pci_func_data
{
26 struct stmmac_pci_dmi_data
{
27 const struct stmmac_pci_func_data
*func
;
31 struct stmmac_pci_info
{
32 int (*setup
)(struct pci_dev
*pdev
, struct plat_stmmacenet_data
*plat
);
35 static int stmmac_pci_find_phy_addr(struct pci_dev
*pdev
,
36 const struct dmi_system_id
*dmi_list
)
38 const struct stmmac_pci_func_data
*func_data
;
39 const struct stmmac_pci_dmi_data
*dmi_data
;
40 const struct dmi_system_id
*dmi_id
;
41 int func
= PCI_FUNC(pdev
->devfn
);
44 dmi_id
= dmi_first_match(dmi_list
);
48 dmi_data
= dmi_id
->driver_data
;
49 func_data
= dmi_data
->func
;
51 for (n
= 0; n
< dmi_data
->nfuncs
; n
++, func_data
++)
52 if (func_data
->func
== func
)
53 return func_data
->phy_addr
;
58 static int serdes_status_poll(struct stmmac_priv
*priv
, int phyaddr
,
59 int phyreg
, u32 mask
, u32 val
)
61 unsigned int retries
= 10;
65 val_rd
= mdiobus_read(priv
->mii
, phyaddr
, phyreg
);
66 if ((val_rd
& mask
) == (val
& mask
))
68 udelay(POLL_DELAY_US
);
74 static int intel_serdes_powerup(struct net_device
*ndev
, void *priv_data
)
76 struct intel_priv_data
*intel_priv
= priv_data
;
77 struct stmmac_priv
*priv
= netdev_priv(ndev
);
78 int serdes_phy_addr
= 0;
81 if (!intel_priv
->mdio_adhoc_addr
)
84 serdes_phy_addr
= intel_priv
->mdio_adhoc_addr
;
87 data
= mdiobus_read(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
);
88 data
|= SERDES_PLL_CLK
;
89 mdiobus_write(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
, data
);
91 /* check for clk_ack assertion */
92 data
= serdes_status_poll(priv
, serdes_phy_addr
,
98 dev_err(priv
->device
, "Serdes PLL clk request timeout\n");
102 /* assert lane reset */
103 data
= mdiobus_read(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
);
105 mdiobus_write(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
, data
);
107 /* check for assert lane reset reflection */
108 data
= serdes_status_poll(priv
, serdes_phy_addr
,
114 dev_err(priv
->device
, "Serdes assert lane reset timeout\n");
118 /* move power state to P0 */
119 data
= mdiobus_read(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
);
121 data
&= ~SERDES_PWR_ST_MASK
;
122 data
|= SERDES_PWR_ST_P0
<< SERDES_PWR_ST_SHIFT
;
124 mdiobus_write(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
, data
);
126 /* Check for P0 state */
127 data
= serdes_status_poll(priv
, serdes_phy_addr
,
130 SERDES_PWR_ST_P0
<< SERDES_PWR_ST_SHIFT
);
133 dev_err(priv
->device
, "Serdes power state P0 timeout.\n");
140 static void intel_serdes_powerdown(struct net_device
*ndev
, void *intel_data
)
142 struct intel_priv_data
*intel_priv
= intel_data
;
143 struct stmmac_priv
*priv
= netdev_priv(ndev
);
144 int serdes_phy_addr
= 0;
147 if (!intel_priv
->mdio_adhoc_addr
)
150 serdes_phy_addr
= intel_priv
->mdio_adhoc_addr
;
152 /* move power state to P3 */
153 data
= mdiobus_read(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
);
155 data
&= ~SERDES_PWR_ST_MASK
;
156 data
|= SERDES_PWR_ST_P3
<< SERDES_PWR_ST_SHIFT
;
158 mdiobus_write(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
, data
);
160 /* Check for P3 state */
161 data
= serdes_status_poll(priv
, serdes_phy_addr
,
164 SERDES_PWR_ST_P3
<< SERDES_PWR_ST_SHIFT
);
167 dev_err(priv
->device
, "Serdes power state P3 timeout\n");
171 /* de-assert clk_req */
172 data
= mdiobus_read(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
);
173 data
&= ~SERDES_PLL_CLK
;
174 mdiobus_write(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
, data
);
176 /* check for clk_ack de-assert */
177 data
= serdes_status_poll(priv
, serdes_phy_addr
,
180 (u32
)~SERDES_PLL_CLK
);
183 dev_err(priv
->device
, "Serdes PLL clk de-assert timeout\n");
187 /* de-assert lane reset */
188 data
= mdiobus_read(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
);
190 mdiobus_write(priv
->mii
, serdes_phy_addr
, SERDES_GCR0
, data
);
192 /* check for de-assert lane reset reflection */
193 data
= serdes_status_poll(priv
, serdes_phy_addr
,
199 dev_err(priv
->device
, "Serdes de-assert lane reset timeout\n");
204 static void common_default_data(struct plat_stmmacenet_data
*plat
)
206 plat
->clk_csr
= 2; /* clk_csr_i = 20-35MHz & MDC = clk_csr_i/16 */
208 plat
->force_sf_dma_mode
= 1;
210 plat
->mdio_bus_data
->needs_reset
= true;
212 /* Set default value for multicast hash bins */
213 plat
->multicast_filter_bins
= HASH_TABLE_SIZE
;
215 /* Set default value for unicast filter entries */
216 plat
->unicast_filter_entries
= 1;
218 /* Set the maxmtu to a default of JUMBO_LEN */
219 plat
->maxmtu
= JUMBO_LEN
;
221 /* Set default number of RX and TX queues to use */
222 plat
->tx_queues_to_use
= 1;
223 plat
->rx_queues_to_use
= 1;
225 /* Disable Priority config by default */
226 plat
->tx_queues_cfg
[0].use_prio
= false;
227 plat
->rx_queues_cfg
[0].use_prio
= false;
229 /* Disable RX queues routing by default */
230 plat
->rx_queues_cfg
[0].pkt_route
= 0x0;
233 static int intel_mgbe_common_data(struct pci_dev
*pdev
,
234 struct plat_stmmacenet_data
*plat
)
243 plat
->force_sf_dma_mode
= 0;
246 plat
->rx_sched_algorithm
= MTL_RX_ALGORITHM_SP
;
248 for (i
= 0; i
< plat
->rx_queues_to_use
; i
++) {
249 plat
->rx_queues_cfg
[i
].mode_to_use
= MTL_QUEUE_DCB
;
250 plat
->rx_queues_cfg
[i
].chan
= i
;
252 /* Disable Priority config by default */
253 plat
->rx_queues_cfg
[i
].use_prio
= false;
255 /* Disable RX queues routing by default */
256 plat
->rx_queues_cfg
[i
].pkt_route
= 0x0;
259 for (i
= 0; i
< plat
->tx_queues_to_use
; i
++) {
260 plat
->tx_queues_cfg
[i
].mode_to_use
= MTL_QUEUE_DCB
;
262 /* Disable Priority config by default */
263 plat
->tx_queues_cfg
[i
].use_prio
= false;
266 /* FIFO size is 4096 bytes for 1 tx/rx queue */
267 plat
->tx_fifo_size
= plat
->tx_queues_to_use
* 4096;
268 plat
->rx_fifo_size
= plat
->rx_queues_to_use
* 4096;
270 plat
->tx_sched_algorithm
= MTL_TX_ALGORITHM_WRR
;
271 plat
->tx_queues_cfg
[0].weight
= 0x09;
272 plat
->tx_queues_cfg
[1].weight
= 0x0A;
273 plat
->tx_queues_cfg
[2].weight
= 0x0B;
274 plat
->tx_queues_cfg
[3].weight
= 0x0C;
275 plat
->tx_queues_cfg
[4].weight
= 0x0D;
276 plat
->tx_queues_cfg
[5].weight
= 0x0E;
277 plat
->tx_queues_cfg
[6].weight
= 0x0F;
278 plat
->tx_queues_cfg
[7].weight
= 0x10;
280 plat
->dma_cfg
->pbl
= 32;
281 plat
->dma_cfg
->pblx8
= true;
282 plat
->dma_cfg
->fixed_burst
= 0;
283 plat
->dma_cfg
->mixed_burst
= 0;
284 plat
->dma_cfg
->aal
= 0;
286 plat
->axi
= devm_kzalloc(&pdev
->dev
, sizeof(*plat
->axi
),
291 plat
->axi
->axi_lpi_en
= 0;
292 plat
->axi
->axi_xit_frm
= 0;
293 plat
->axi
->axi_wr_osr_lmt
= 1;
294 plat
->axi
->axi_rd_osr_lmt
= 1;
295 plat
->axi
->axi_blen
[0] = 4;
296 plat
->axi
->axi_blen
[1] = 8;
297 plat
->axi
->axi_blen
[2] = 16;
299 plat
->ptp_max_adj
= plat
->clk_ptp_rate
;
300 plat
->eee_usecs_rate
= plat
->clk_ptp_rate
;
302 /* Set system clock */
303 plat
->stmmac_clk
= clk_register_fixed_rate(&pdev
->dev
,
304 "stmmac-clk", NULL
, 0,
307 if (IS_ERR(plat
->stmmac_clk
)) {
308 dev_warn(&pdev
->dev
, "Fail to register stmmac-clk\n");
309 plat
->stmmac_clk
= NULL
;
312 ret
= clk_prepare_enable(plat
->stmmac_clk
);
314 clk_unregister_fixed_rate(plat
->stmmac_clk
);
318 /* Set default value for multicast hash bins */
319 plat
->multicast_filter_bins
= HASH_TABLE_SIZE
;
321 /* Set default value for unicast filter entries */
322 plat
->unicast_filter_entries
= 1;
324 /* Set the maxmtu to a default of JUMBO_LEN */
325 plat
->maxmtu
= JUMBO_LEN
;
327 plat
->vlan_fail_q_en
= true;
329 /* Use the last Rx queue */
330 plat
->vlan_fail_q
= plat
->rx_queues_to_use
- 1;
335 static int ehl_common_data(struct pci_dev
*pdev
,
336 struct plat_stmmacenet_data
*plat
)
338 plat
->rx_queues_to_use
= 8;
339 plat
->tx_queues_to_use
= 8;
340 plat
->clk_ptp_rate
= 200000000;
342 return intel_mgbe_common_data(pdev
, plat
);
345 static int ehl_sgmii_data(struct pci_dev
*pdev
,
346 struct plat_stmmacenet_data
*plat
)
349 plat
->phy_interface
= PHY_INTERFACE_MODE_SGMII
;
351 plat
->serdes_powerup
= intel_serdes_powerup
;
352 plat
->serdes_powerdown
= intel_serdes_powerdown
;
354 return ehl_common_data(pdev
, plat
);
357 static struct stmmac_pci_info ehl_sgmii1g_info
= {
358 .setup
= ehl_sgmii_data
,
361 static int ehl_rgmii_data(struct pci_dev
*pdev
,
362 struct plat_stmmacenet_data
*plat
)
365 plat
->phy_interface
= PHY_INTERFACE_MODE_RGMII
;
367 return ehl_common_data(pdev
, plat
);
370 static struct stmmac_pci_info ehl_rgmii1g_info
= {
371 .setup
= ehl_rgmii_data
,
374 static int ehl_pse0_common_data(struct pci_dev
*pdev
,
375 struct plat_stmmacenet_data
*plat
)
378 return ehl_common_data(pdev
, plat
);
381 static int ehl_pse0_rgmii1g_data(struct pci_dev
*pdev
,
382 struct plat_stmmacenet_data
*plat
)
384 plat
->phy_interface
= PHY_INTERFACE_MODE_RGMII_ID
;
385 return ehl_pse0_common_data(pdev
, plat
);
388 static struct stmmac_pci_info ehl_pse0_rgmii1g_info
= {
389 .setup
= ehl_pse0_rgmii1g_data
,
392 static int ehl_pse0_sgmii1g_data(struct pci_dev
*pdev
,
393 struct plat_stmmacenet_data
*plat
)
395 plat
->phy_interface
= PHY_INTERFACE_MODE_SGMII
;
396 plat
->serdes_powerup
= intel_serdes_powerup
;
397 plat
->serdes_powerdown
= intel_serdes_powerdown
;
398 return ehl_pse0_common_data(pdev
, plat
);
401 static struct stmmac_pci_info ehl_pse0_sgmii1g_info
= {
402 .setup
= ehl_pse0_sgmii1g_data
,
405 static int ehl_pse1_common_data(struct pci_dev
*pdev
,
406 struct plat_stmmacenet_data
*plat
)
409 return ehl_common_data(pdev
, plat
);
412 static int ehl_pse1_rgmii1g_data(struct pci_dev
*pdev
,
413 struct plat_stmmacenet_data
*plat
)
415 plat
->phy_interface
= PHY_INTERFACE_MODE_RGMII_ID
;
416 return ehl_pse1_common_data(pdev
, plat
);
419 static struct stmmac_pci_info ehl_pse1_rgmii1g_info
= {
420 .setup
= ehl_pse1_rgmii1g_data
,
423 static int ehl_pse1_sgmii1g_data(struct pci_dev
*pdev
,
424 struct plat_stmmacenet_data
*plat
)
426 plat
->phy_interface
= PHY_INTERFACE_MODE_SGMII
;
427 plat
->serdes_powerup
= intel_serdes_powerup
;
428 plat
->serdes_powerdown
= intel_serdes_powerdown
;
429 return ehl_pse1_common_data(pdev
, plat
);
432 static struct stmmac_pci_info ehl_pse1_sgmii1g_info
= {
433 .setup
= ehl_pse1_sgmii1g_data
,
436 static int tgl_common_data(struct pci_dev
*pdev
,
437 struct plat_stmmacenet_data
*plat
)
439 plat
->rx_queues_to_use
= 6;
440 plat
->tx_queues_to_use
= 4;
441 plat
->clk_ptp_rate
= 200000000;
443 return intel_mgbe_common_data(pdev
, plat
);
446 static int tgl_sgmii_data(struct pci_dev
*pdev
,
447 struct plat_stmmacenet_data
*plat
)
450 plat
->phy_interface
= PHY_INTERFACE_MODE_SGMII
;
451 plat
->serdes_powerup
= intel_serdes_powerup
;
452 plat
->serdes_powerdown
= intel_serdes_powerdown
;
453 return tgl_common_data(pdev
, plat
);
456 static struct stmmac_pci_info tgl_sgmii1g_info
= {
457 .setup
= tgl_sgmii_data
,
460 static const struct stmmac_pci_func_data galileo_stmmac_func_data
[] = {
467 static const struct stmmac_pci_dmi_data galileo_stmmac_dmi_data
= {
468 .func
= galileo_stmmac_func_data
,
469 .nfuncs
= ARRAY_SIZE(galileo_stmmac_func_data
),
472 static const struct stmmac_pci_func_data iot2040_stmmac_func_data
[] = {
483 static const struct stmmac_pci_dmi_data iot2040_stmmac_dmi_data
= {
484 .func
= iot2040_stmmac_func_data
,
485 .nfuncs
= ARRAY_SIZE(iot2040_stmmac_func_data
),
488 static const struct dmi_system_id quark_pci_dmi
[] = {
491 DMI_EXACT_MATCH(DMI_BOARD_NAME
, "Galileo"),
493 .driver_data
= (void *)&galileo_stmmac_dmi_data
,
497 DMI_EXACT_MATCH(DMI_BOARD_NAME
, "GalileoGen2"),
499 .driver_data
= (void *)&galileo_stmmac_dmi_data
,
501 /* There are 2 types of SIMATIC IOT2000: IOT2020 and IOT2040.
502 * The asset tag "6ES7647-0AA00-0YA2" is only for IOT2020 which
503 * has only one pci network device while other asset tags are
504 * for IOT2040 which has two.
508 DMI_EXACT_MATCH(DMI_BOARD_NAME
, "SIMATIC IOT2000"),
509 DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG
,
510 "6ES7647-0AA00-0YA2"),
512 .driver_data
= (void *)&galileo_stmmac_dmi_data
,
516 DMI_EXACT_MATCH(DMI_BOARD_NAME
, "SIMATIC IOT2000"),
518 .driver_data
= (void *)&iot2040_stmmac_dmi_data
,
523 static int quark_default_data(struct pci_dev
*pdev
,
524 struct plat_stmmacenet_data
*plat
)
528 /* Set common default data first */
529 common_default_data(plat
);
531 /* Refuse to load the driver and register net device if MAC controller
532 * does not connect to any PHY interface.
534 ret
= stmmac_pci_find_phy_addr(pdev
, quark_pci_dmi
);
536 /* Return error to the caller on DMI enabled boards. */
537 if (dmi_get_system_info(DMI_BOARD_NAME
))
540 /* Galileo boards with old firmware don't support DMI. We always
541 * use 1 here as PHY address, so at least the first found MAC
542 * controller would be probed.
547 plat
->bus_id
= pci_dev_id(pdev
);
548 plat
->phy_addr
= ret
;
549 plat
->phy_interface
= PHY_INTERFACE_MODE_RMII
;
551 plat
->dma_cfg
->pbl
= 16;
552 plat
->dma_cfg
->pblx8
= true;
553 plat
->dma_cfg
->fixed_burst
= 1;
559 static const struct stmmac_pci_info quark_info
= {
560 .setup
= quark_default_data
,
564 * intel_eth_pci_probe
566 * @pdev: pci device pointer
567 * @id: pointer to table of device id/id's.
569 * Description: This probing function gets called for all PCI devices which
570 * match the ID table and are not "owned" by other driver yet. This function
571 * gets passed a "struct pci_dev *" for each device whose entry in the ID table
572 * matches the device. The probe functions returns zero when the driver choose
573 * to take "ownership" of the device or an error code(-ve no) otherwise.
575 static int intel_eth_pci_probe(struct pci_dev
*pdev
,
576 const struct pci_device_id
*id
)
578 struct stmmac_pci_info
*info
= (struct stmmac_pci_info
*)id
->driver_data
;
579 struct intel_priv_data
*intel_priv
;
580 struct plat_stmmacenet_data
*plat
;
581 struct stmmac_resources res
;
584 intel_priv
= devm_kzalloc(&pdev
->dev
, sizeof(*intel_priv
), GFP_KERNEL
);
588 plat
= devm_kzalloc(&pdev
->dev
, sizeof(*plat
), GFP_KERNEL
);
592 plat
->mdio_bus_data
= devm_kzalloc(&pdev
->dev
,
593 sizeof(*plat
->mdio_bus_data
),
595 if (!plat
->mdio_bus_data
)
598 plat
->dma_cfg
= devm_kzalloc(&pdev
->dev
, sizeof(*plat
->dma_cfg
),
603 /* Enable pci device */
604 ret
= pci_enable_device(pdev
);
606 dev_err(&pdev
->dev
, "%s: ERROR: failed to enable device\n",
611 ret
= pcim_iomap_regions(pdev
, BIT(0), pci_name(pdev
));
615 pci_set_master(pdev
);
617 plat
->bsp_priv
= intel_priv
;
618 intel_priv
->mdio_adhoc_addr
= 0x15;
620 ret
= info
->setup(pdev
, plat
);
624 ret
= pci_alloc_irq_vectors(pdev
, 1, 1, PCI_IRQ_ALL_TYPES
);
628 memset(&res
, 0, sizeof(res
));
629 res
.addr
= pcim_iomap_table(pdev
)[0];
630 res
.wol_irq
= pci_irq_vector(pdev
, 0);
631 res
.irq
= pci_irq_vector(pdev
, 0);
633 if (plat
->eee_usecs_rate
> 0) {
636 tx_lpi_usec
= (plat
->eee_usecs_rate
/ 1000000) - 1;
637 writel(tx_lpi_usec
, res
.addr
+ GMAC_1US_TIC_COUNTER
);
640 ret
= stmmac_dvr_probe(&pdev
->dev
, plat
, &res
);
642 pci_free_irq_vectors(pdev
);
643 clk_disable_unprepare(plat
->stmmac_clk
);
644 clk_unregister_fixed_rate(plat
->stmmac_clk
);
651 * intel_eth_pci_remove
653 * @pdev: platform device pointer
654 * Description: this function calls the main to free the net resources
655 * and releases the PCI resources.
657 static void intel_eth_pci_remove(struct pci_dev
*pdev
)
659 struct net_device
*ndev
= dev_get_drvdata(&pdev
->dev
);
660 struct stmmac_priv
*priv
= netdev_priv(ndev
);
662 stmmac_dvr_remove(&pdev
->dev
);
664 pci_free_irq_vectors(pdev
);
666 clk_unregister_fixed_rate(priv
->plat
->stmmac_clk
);
668 pcim_iounmap_regions(pdev
, BIT(0));
670 pci_disable_device(pdev
);
673 static int __maybe_unused
intel_eth_pci_suspend(struct device
*dev
)
675 struct pci_dev
*pdev
= to_pci_dev(dev
);
678 ret
= stmmac_suspend(dev
);
682 ret
= pci_save_state(pdev
);
686 pci_disable_device(pdev
);
687 pci_wake_from_d3(pdev
, true);
691 static int __maybe_unused
intel_eth_pci_resume(struct device
*dev
)
693 struct pci_dev
*pdev
= to_pci_dev(dev
);
696 pci_restore_state(pdev
);
697 pci_set_power_state(pdev
, PCI_D0
);
699 ret
= pci_enable_device(pdev
);
703 pci_set_master(pdev
);
705 return stmmac_resume(dev
);
708 static SIMPLE_DEV_PM_OPS(intel_eth_pm_ops
, intel_eth_pci_suspend
,
709 intel_eth_pci_resume
);
711 #define PCI_DEVICE_ID_INTEL_QUARK_ID 0x0937
712 #define PCI_DEVICE_ID_INTEL_EHL_RGMII1G_ID 0x4b30
713 #define PCI_DEVICE_ID_INTEL_EHL_SGMII1G_ID 0x4b31
714 #define PCI_DEVICE_ID_INTEL_EHL_SGMII2G5_ID 0x4b32
715 /* Intel(R) Programmable Services Engine (Intel(R) PSE) consist of 2 MAC
716 * which are named PSE0 and PSE1
718 #define PCI_DEVICE_ID_INTEL_EHL_PSE0_RGMII1G_ID 0x4ba0
719 #define PCI_DEVICE_ID_INTEL_EHL_PSE0_SGMII1G_ID 0x4ba1
720 #define PCI_DEVICE_ID_INTEL_EHL_PSE0_SGMII2G5_ID 0x4ba2
721 #define PCI_DEVICE_ID_INTEL_EHL_PSE1_RGMII1G_ID 0x4bb0
722 #define PCI_DEVICE_ID_INTEL_EHL_PSE1_SGMII1G_ID 0x4bb1
723 #define PCI_DEVICE_ID_INTEL_EHL_PSE1_SGMII2G5_ID 0x4bb2
724 #define PCI_DEVICE_ID_INTEL_TGLH_SGMII1G_0_ID 0x43ac
725 #define PCI_DEVICE_ID_INTEL_TGLH_SGMII1G_1_ID 0x43a2
726 #define PCI_DEVICE_ID_INTEL_TGL_SGMII1G_ID 0xa0ac
728 static const struct pci_device_id intel_eth_pci_id_table
[] = {
729 { PCI_DEVICE_DATA(INTEL
, QUARK_ID
, &quark_info
) },
730 { PCI_DEVICE_DATA(INTEL
, EHL_RGMII1G_ID
, &ehl_rgmii1g_info
) },
731 { PCI_DEVICE_DATA(INTEL
, EHL_SGMII1G_ID
, &ehl_sgmii1g_info
) },
732 { PCI_DEVICE_DATA(INTEL
, EHL_SGMII2G5_ID
, &ehl_sgmii1g_info
) },
733 { PCI_DEVICE_DATA(INTEL
, EHL_PSE0_RGMII1G_ID
, &ehl_pse0_rgmii1g_info
) },
734 { PCI_DEVICE_DATA(INTEL
, EHL_PSE0_SGMII1G_ID
, &ehl_pse0_sgmii1g_info
) },
735 { PCI_DEVICE_DATA(INTEL
, EHL_PSE0_SGMII2G5_ID
, &ehl_pse0_sgmii1g_info
) },
736 { PCI_DEVICE_DATA(INTEL
, EHL_PSE1_RGMII1G_ID
, &ehl_pse1_rgmii1g_info
) },
737 { PCI_DEVICE_DATA(INTEL
, EHL_PSE1_SGMII1G_ID
, &ehl_pse1_sgmii1g_info
) },
738 { PCI_DEVICE_DATA(INTEL
, EHL_PSE1_SGMII2G5_ID
, &ehl_pse1_sgmii1g_info
) },
739 { PCI_DEVICE_DATA(INTEL
, TGL_SGMII1G_ID
, &tgl_sgmii1g_info
) },
740 { PCI_DEVICE_DATA(INTEL
, TGLH_SGMII1G_0_ID
, &tgl_sgmii1g_info
) },
741 { PCI_DEVICE_DATA(INTEL
, TGLH_SGMII1G_1_ID
, &tgl_sgmii1g_info
) },
744 MODULE_DEVICE_TABLE(pci
, intel_eth_pci_id_table
);
746 static struct pci_driver intel_eth_pci_driver
= {
747 .name
= "intel-eth-pci",
748 .id_table
= intel_eth_pci_id_table
,
749 .probe
= intel_eth_pci_probe
,
750 .remove
= intel_eth_pci_remove
,
752 .pm
= &intel_eth_pm_ops
,
756 module_pci_driver(intel_eth_pci_driver
);
758 MODULE_DESCRIPTION("INTEL 10/100/1000 Ethernet PCI driver");
759 MODULE_AUTHOR("Voon Weifeng <weifeng.voon@intel.com>");
760 MODULE_LICENSE("GPL v2");