1313static DEFINE_XARRAY (ice_adapters );
1414static DEFINE_MUTEX (ice_adapters_mutex );
1515
16- static unsigned long ice_adapter_index (u64 dsn )
16+ #define ICE_ADAPTER_FIXED_INDEX BIT_ULL(63)
17+
18+ #define ICE_ADAPTER_INDEX_E825C \
19+ (ICE_DEV_ID_E825C_BACKPLANE | ICE_ADAPTER_FIXED_INDEX)
20+
21+ static u64 ice_adapter_index (struct pci_dev * pdev )
1722{
23+ switch (pdev -> device ) {
24+ case ICE_DEV_ID_E825C_BACKPLANE :
25+ case ICE_DEV_ID_E825C_QSFP :
26+ case ICE_DEV_ID_E825C_SFP :
27+ case ICE_DEV_ID_E825C_SGMII :
28+ /* E825C devices have multiple NACs which are connected to the
29+ * same clock source, and which must share the same
30+ * ice_adapter structure. We can't use the serial number since
31+ * each NAC has its own NVM generated with its own unique
32+ * Device Serial Number. Instead, rely on the embedded nature
33+ * of the E825C devices, and use a fixed index. This relies on
34+ * the fact that all E825C physical functions in a given
35+ * system are part of the same overall device.
36+ */
37+ return ICE_ADAPTER_INDEX_E825C ;
38+ default :
39+ return pci_get_dsn (pdev ) & ~ICE_ADAPTER_FIXED_INDEX ;
40+ }
41+ }
42+
43+ static unsigned long ice_adapter_xa_index (struct pci_dev * pdev )
44+ {
45+ u64 index = ice_adapter_index (pdev );
46+
1847#if BITS_PER_LONG == 64
19- return dsn ;
48+ return index ;
2049#else
21- return (u32 )dsn ^ (u32 )(dsn >> 32 );
50+ return (u32 )index ^ (u32 )(index >> 32 );
2251#endif
2352}
2453
25- static struct ice_adapter * ice_adapter_new (u64 dsn )
54+ static struct ice_adapter * ice_adapter_new (struct pci_dev * pdev )
2655{
2756 struct ice_adapter * adapter ;
2857
2958 adapter = kzalloc (sizeof (* adapter ), GFP_KERNEL );
3059 if (!adapter )
3160 return NULL ;
3261
33- adapter -> device_serial_number = dsn ;
62+ adapter -> index = ice_adapter_index ( pdev ) ;
3463 spin_lock_init (& adapter -> ptp_gltsyn_time_lock );
3564 refcount_set (& adapter -> refcount , 1 );
3665
@@ -63,24 +92,23 @@ static void ice_adapter_free(struct ice_adapter *adapter)
6392 */
6493struct ice_adapter * ice_adapter_get (struct pci_dev * pdev )
6594{
66- u64 dsn = pci_get_dsn (pdev );
6795 struct ice_adapter * adapter ;
6896 unsigned long index ;
6997 int err ;
7098
71- index = ice_adapter_index ( dsn );
99+ index = ice_adapter_xa_index ( pdev );
72100 scoped_guard (mutex , & ice_adapters_mutex ) {
73101 err = xa_insert (& ice_adapters , index , NULL , GFP_KERNEL );
74102 if (err == - EBUSY ) {
75103 adapter = xa_load (& ice_adapters , index );
76104 refcount_inc (& adapter -> refcount );
77- WARN_ON_ONCE (adapter -> device_serial_number != dsn );
105+ WARN_ON_ONCE (adapter -> index != ice_adapter_index ( pdev ) );
78106 return adapter ;
79107 }
80108 if (err )
81109 return ERR_PTR (err );
82110
83- adapter = ice_adapter_new (dsn );
111+ adapter = ice_adapter_new (pdev );
84112 if (!adapter )
85113 return ERR_PTR (- ENOMEM );
86114 xa_store (& ice_adapters , index , adapter , GFP_KERNEL );
@@ -99,11 +127,10 @@ struct ice_adapter *ice_adapter_get(struct pci_dev *pdev)
99127 */
100128void ice_adapter_put (struct pci_dev * pdev )
101129{
102- u64 dsn = pci_get_dsn (pdev );
103130 struct ice_adapter * adapter ;
104131 unsigned long index ;
105132
106- index = ice_adapter_index ( dsn );
133+ index = ice_adapter_xa_index ( pdev );
107134 scoped_guard (mutex , & ice_adapters_mutex ) {
108135 adapter = xa_load (& ice_adapters , index );
109136 if (WARN_ON (!adapter ))
0 commit comments