2525
2626static const struct fm10k_info * fm10k_info_tbl [] = {
2727 [fm10k_device_pf ] = & fm10k_pf_info ,
28+ [fm10k_device_vf ] = & fm10k_vf_info ,
2829};
2930
3031/**
@@ -38,6 +39,7 @@ static const struct fm10k_info *fm10k_info_tbl[] = {
3839 */
3940static const struct pci_device_id fm10k_pci_tbl [] = {
4041 { PCI_VDEVICE (INTEL , FM10K_DEV_ID_PF ), fm10k_device_pf },
42+ { PCI_VDEVICE (INTEL , FM10K_DEV_ID_VF ), fm10k_device_vf },
4143 /* required last entry */
4244 { 0 , }
4345};
@@ -805,6 +807,28 @@ static irqreturn_t fm10k_msix_clean_rings(int irq, void *data)
805807 return IRQ_HANDLED ;
806808}
807809
810+ static irqreturn_t fm10k_msix_mbx_vf (int irq , void * data )
811+ {
812+ struct fm10k_intfc * interface = data ;
813+ struct fm10k_hw * hw = & interface -> hw ;
814+ struct fm10k_mbx_info * mbx = & hw -> mbx ;
815+
816+ /* re-enable mailbox interrupt and indicate 20us delay */
817+ fm10k_write_reg (hw , FM10K_VFITR (FM10K_MBX_VECTOR ),
818+ FM10K_ITR_ENABLE | FM10K_MBX_INT_DELAY );
819+
820+ /* service upstream mailbox */
821+ if (fm10k_mbx_trylock (interface )) {
822+ mbx -> ops .process (hw , mbx );
823+ fm10k_mbx_unlock (interface );
824+ }
825+
826+ hw -> mac .get_host_state = 1 ;
827+ fm10k_service_event_schedule (interface );
828+
829+ return IRQ_HANDLED ;
830+ }
831+
808832#define FM10K_ERR_MSG (type ) case (type): error = #type; break
809833static void fm10k_print_fault (struct fm10k_intfc * interface , int type ,
810834 struct fm10k_fault * fault )
@@ -996,13 +1020,42 @@ void fm10k_mbx_free_irq(struct fm10k_intfc *interface)
9961020 FM10K_EIMR_DISABLE (VFLR ) |
9971021 FM10K_EIMR_DISABLE (MAXHOLDTIME ));
9981022 itr_reg = FM10K_ITR (FM10K_MBX_VECTOR );
1023+ } else {
1024+ itr_reg = FM10K_VFITR (FM10K_MBX_VECTOR );
9991025 }
10001026
10011027 fm10k_write_reg (hw , itr_reg , FM10K_ITR_MASK_SET );
10021028
10031029 free_irq (entry -> vector , interface );
10041030}
10051031
1032+ static s32 fm10k_mbx_mac_addr (struct fm10k_hw * hw , u32 * * results ,
1033+ struct fm10k_mbx_info * mbx )
1034+ {
1035+ bool vlan_override = hw -> mac .vlan_override ;
1036+ u16 default_vid = hw -> mac .default_vid ;
1037+ struct fm10k_intfc * interface ;
1038+ s32 err ;
1039+
1040+ err = fm10k_msg_mac_vlan_vf (hw , results , mbx );
1041+ if (err )
1042+ return err ;
1043+
1044+ interface = container_of (hw , struct fm10k_intfc , hw );
1045+
1046+ /* MAC was changed so we need reset */
1047+ if (is_valid_ether_addr (hw -> mac .perm_addr ) &&
1048+ memcmp (hw -> mac .perm_addr , hw -> mac .addr , ETH_ALEN ))
1049+ interface -> flags |= FM10K_FLAG_RESET_REQUESTED ;
1050+
1051+ /* VLAN override was changed, or default VLAN changed */
1052+ if ((vlan_override != hw -> mac .vlan_override ) ||
1053+ (default_vid != hw -> mac .default_vid ))
1054+ interface -> flags |= FM10K_FLAG_RESET_REQUESTED ;
1055+
1056+ return 0 ;
1057+ }
1058+
10061059/* generic error handler for mailbox issues */
10071060static s32 fm10k_mbx_error (struct fm10k_hw * hw , u32 * * results ,
10081061 struct fm10k_mbx_info * mbx )
@@ -1019,6 +1072,46 @@ static s32 fm10k_mbx_error(struct fm10k_hw *hw, u32 **results,
10191072 return 0 ;
10201073}
10211074
1075+ static const struct fm10k_msg_data vf_mbx_data [] = {
1076+ FM10K_TLV_MSG_TEST_HANDLER (fm10k_tlv_msg_test ),
1077+ FM10K_VF_MSG_MAC_VLAN_HANDLER (fm10k_mbx_mac_addr ),
1078+ FM10K_VF_MSG_LPORT_STATE_HANDLER (fm10k_msg_lport_state_vf ),
1079+ FM10K_TLV_MSG_ERROR_HANDLER (fm10k_mbx_error ),
1080+ };
1081+
1082+ static int fm10k_mbx_request_irq_vf (struct fm10k_intfc * interface )
1083+ {
1084+ struct msix_entry * entry = & interface -> msix_entries [FM10K_MBX_VECTOR ];
1085+ struct net_device * dev = interface -> netdev ;
1086+ struct fm10k_hw * hw = & interface -> hw ;
1087+ int err ;
1088+
1089+ /* Use timer0 for interrupt moderation on the mailbox */
1090+ u32 itr = FM10K_INT_MAP_TIMER0 | entry -> entry ;
1091+
1092+ /* register mailbox handlers */
1093+ err = hw -> mbx .ops .register_handlers (& hw -> mbx , vf_mbx_data );
1094+ if (err )
1095+ return err ;
1096+
1097+ /* request the IRQ */
1098+ err = request_irq (entry -> vector , fm10k_msix_mbx_vf , 0 ,
1099+ dev -> name , interface );
1100+ if (err ) {
1101+ netif_err (interface , probe , dev ,
1102+ "request_irq for msix_mbx failed: %d\n" , err );
1103+ return err ;
1104+ }
1105+
1106+ /* map all of the interrupt sources */
1107+ fm10k_write_reg (hw , FM10K_VFINT_MAP , itr );
1108+
1109+ /* enable interrupt */
1110+ fm10k_write_reg (hw , FM10K_VFITR (entry -> entry ), FM10K_ITR_ENABLE );
1111+
1112+ return 0 ;
1113+ }
1114+
10221115static s32 fm10k_lport_map (struct fm10k_hw * hw , u32 * * results ,
10231116 struct fm10k_mbx_info * mbx )
10241117{
@@ -1142,7 +1235,10 @@ int fm10k_mbx_request_irq(struct fm10k_intfc *interface)
11421235 int err ;
11431236
11441237 /* enable Mailbox cause */
1145- err = fm10k_mbx_request_irq_pf (interface );
1238+ if (hw -> mac .type == fm10k_mac_pf )
1239+ err = fm10k_mbx_request_irq_pf (interface );
1240+ else
1241+ err = fm10k_mbx_request_irq_vf (interface );
11461242
11471243 /* connect mailbox */
11481244 if (!err )
@@ -1220,7 +1316,9 @@ int fm10k_qv_request_irq(struct fm10k_intfc *interface)
12201316 }
12211317
12221318 /* Assign ITR register to q_vector */
1223- q_vector -> itr = & interface -> uc_addr [FM10K_ITR (entry -> entry )];
1319+ q_vector -> itr = (hw -> mac .type == fm10k_mac_pf ) ?
1320+ & interface -> uc_addr [FM10K_ITR (entry -> entry )] :
1321+ & interface -> uc_addr [FM10K_VFITR (entry -> entry )];
12241322
12251323 /* request the IRQ */
12261324 err = request_irq (entry -> vector , & fm10k_msix_clean_rings , 0 ,
0 commit comments