@@ -2039,10 +2039,9 @@ static void liquidio_set_mcast_list(struct net_device *netdev)
2039
2039
/* Apparently, any activity in this call from the kernel has to
2040
2040
* be atomic. So we won't wait for response.
2041
2041
*/
2042
- nctrl .wait_time = 0 ;
2043
2042
2044
2043
ret = octnet_send_nic_ctrl_pkt (lio -> oct_dev , & nctrl );
2045
- if (ret < 0 ) {
2044
+ if (ret ) {
2046
2045
dev_err (& oct -> pci_dev -> dev , "DEVFLAGS change failed in core (ret: 0x%x)\n" ,
2047
2046
ret );
2048
2047
}
@@ -2071,8 +2070,6 @@ static int liquidio_set_mac(struct net_device *netdev, void *p)
2071
2070
nctrl .ncmd .s .more = 1 ;
2072
2071
nctrl .iq_no = lio -> linfo .txpciq [0 ].s .q_no ;
2073
2072
nctrl .netpndev = (u64 )netdev ;
2074
- nctrl .cb_fn = liquidio_link_ctrl_cmd_completion ;
2075
- nctrl .wait_time = 100 ;
2076
2073
2077
2074
nctrl .udd [0 ] = 0 ;
2078
2075
/* The MAC Address is presented in network byte order. */
@@ -2083,6 +2080,14 @@ static int liquidio_set_mac(struct net_device *netdev, void *p)
2083
2080
dev_err (& oct -> pci_dev -> dev , "MAC Address change failed\n" );
2084
2081
return - ENOMEM ;
2085
2082
}
2083
+
2084
+ if (nctrl .sc_status ) {
2085
+ dev_err (& oct -> pci_dev -> dev ,
2086
+ "%s: MAC Address change failed. sc return=%x\n" ,
2087
+ __func__ , nctrl .sc_status );
2088
+ return - EIO ;
2089
+ }
2090
+
2086
2091
memcpy (netdev -> dev_addr , addr -> sa_data , netdev -> addr_len );
2087
2092
memcpy (((u8 * )& lio -> linfo .hw_addr ) + 2 , addr -> sa_data , ETH_ALEN );
2088
2093
@@ -2623,14 +2628,15 @@ static int liquidio_vlan_rx_add_vid(struct net_device *netdev,
2623
2628
nctrl .ncmd .s .cmd = OCTNET_CMD_ADD_VLAN_FILTER ;
2624
2629
nctrl .ncmd .s .param1 = vid ;
2625
2630
nctrl .iq_no = lio -> linfo .txpciq [0 ].s .q_no ;
2626
- nctrl .wait_time = 100 ;
2627
2631
nctrl .netpndev = (u64 )netdev ;
2628
2632
nctrl .cb_fn = liquidio_link_ctrl_cmd_completion ;
2629
2633
2630
2634
ret = octnet_send_nic_ctrl_pkt (lio -> oct_dev , & nctrl );
2631
- if (ret < 0 ) {
2635
+ if (ret ) {
2632
2636
dev_err (& oct -> pci_dev -> dev , "Add VLAN filter failed in core (ret: 0x%x)\n" ,
2633
2637
ret );
2638
+ if (ret > 0 )
2639
+ ret = - EIO ;
2634
2640
}
2635
2641
2636
2642
return ret ;
@@ -2651,14 +2657,15 @@ static int liquidio_vlan_rx_kill_vid(struct net_device *netdev,
2651
2657
nctrl .ncmd .s .cmd = OCTNET_CMD_DEL_VLAN_FILTER ;
2652
2658
nctrl .ncmd .s .param1 = vid ;
2653
2659
nctrl .iq_no = lio -> linfo .txpciq [0 ].s .q_no ;
2654
- nctrl .wait_time = 100 ;
2655
2660
nctrl .netpndev = (u64 )netdev ;
2656
2661
nctrl .cb_fn = liquidio_link_ctrl_cmd_completion ;
2657
2662
2658
2663
ret = octnet_send_nic_ctrl_pkt (lio -> oct_dev , & nctrl );
2659
- if (ret < 0 ) {
2664
+ if (ret ) {
2660
2665
dev_err (& oct -> pci_dev -> dev , "Del VLAN filter failed in core (ret: 0x%x)\n" ,
2661
2666
ret );
2667
+ if (ret > 0 )
2668
+ ret = - EIO ;
2662
2669
}
2663
2670
return ret ;
2664
2671
}
@@ -2684,15 +2691,16 @@ static int liquidio_set_rxcsum_command(struct net_device *netdev, int command,
2684
2691
nctrl .ncmd .s .cmd = command ;
2685
2692
nctrl .ncmd .s .param1 = rx_cmd ;
2686
2693
nctrl .iq_no = lio -> linfo .txpciq [0 ].s .q_no ;
2687
- nctrl .wait_time = 100 ;
2688
2694
nctrl .netpndev = (u64 )netdev ;
2689
2695
nctrl .cb_fn = liquidio_link_ctrl_cmd_completion ;
2690
2696
2691
2697
ret = octnet_send_nic_ctrl_pkt (lio -> oct_dev , & nctrl );
2692
- if (ret < 0 ) {
2698
+ if (ret ) {
2693
2699
dev_err (& oct -> pci_dev -> dev ,
2694
2700
"DEVFLAGS RXCSUM change failed in core(ret:0x%x)\n" ,
2695
2701
ret );
2702
+ if (ret > 0 )
2703
+ ret = - EIO ;
2696
2704
}
2697
2705
return ret ;
2698
2706
}
@@ -2720,15 +2728,16 @@ static int liquidio_vxlan_port_command(struct net_device *netdev, int command,
2720
2728
nctrl .ncmd .s .more = vxlan_cmd_bit ;
2721
2729
nctrl .ncmd .s .param1 = vxlan_port ;
2722
2730
nctrl .iq_no = lio -> linfo .txpciq [0 ].s .q_no ;
2723
- nctrl .wait_time = 100 ;
2724
2731
nctrl .netpndev = (u64 )netdev ;
2725
2732
nctrl .cb_fn = liquidio_link_ctrl_cmd_completion ;
2726
2733
2727
2734
ret = octnet_send_nic_ctrl_pkt (lio -> oct_dev , & nctrl );
2728
- if (ret < 0 ) {
2735
+ if (ret ) {
2729
2736
dev_err (& oct -> pci_dev -> dev ,
2730
2737
"VxLAN port add/delete failed in core (ret:0x%x)\n" ,
2731
2738
ret );
2739
+ if (ret > 0 )
2740
+ ret = - EIO ;
2732
2741
}
2733
2742
return ret ;
2734
2743
}
@@ -2851,6 +2860,7 @@ static int __liquidio_set_vf_mac(struct net_device *netdev, int vfidx,
2851
2860
struct lio * lio = GET_LIO (netdev );
2852
2861
struct octeon_device * oct = lio -> oct_dev ;
2853
2862
struct octnic_ctrl_pkt nctrl ;
2863
+ int ret = 0 ;
2854
2864
2855
2865
if (!is_valid_ether_addr (mac ))
2856
2866
return - EINVAL ;
@@ -2864,22 +2874,25 @@ static int __liquidio_set_vf_mac(struct net_device *netdev, int vfidx,
2864
2874
nctrl .ncmd .s .cmd = OCTNET_CMD_CHANGE_MACADDR ;
2865
2875
/* vfidx is 0 based, but vf_num (param1) is 1 based */
2866
2876
nctrl .ncmd .s .param1 = vfidx + 1 ;
2867
- nctrl .ncmd .s .param2 = (is_admin_assigned ? 1 : 0 );
2868
2877
nctrl .ncmd .s .more = 1 ;
2869
2878
nctrl .iq_no = lio -> linfo .txpciq [0 ].s .q_no ;
2870
2879
nctrl .netpndev = (u64 )netdev ;
2871
- nctrl .cb_fn = liquidio_link_ctrl_cmd_completion ;
2872
- nctrl .wait_time = LIO_CMD_WAIT_TM ;
2880
+ if (is_admin_assigned ) {
2881
+ nctrl .ncmd .s .param2 = true;
2882
+ nctrl .cb_fn = liquidio_link_ctrl_cmd_completion ;
2883
+ }
2873
2884
2874
2885
nctrl .udd [0 ] = 0 ;
2875
2886
/* The MAC Address is presented in network byte order. */
2876
2887
ether_addr_copy ((u8 * )& nctrl .udd [0 ] + 2 , mac );
2877
2888
2878
2889
oct -> sriov_info .vf_macaddr [vfidx ] = nctrl .udd [0 ];
2879
2890
2880
- octnet_send_nic_ctrl_pkt (oct , & nctrl );
2891
+ ret = octnet_send_nic_ctrl_pkt (oct , & nctrl );
2892
+ if (ret > 0 )
2893
+ ret = - EIO ;
2881
2894
2882
- return 0 ;
2895
+ return ret ;
2883
2896
}
2884
2897
2885
2898
static int liquidio_set_vf_mac (struct net_device * netdev , int vfidx , u8 * mac )
@@ -2905,6 +2918,7 @@ static int liquidio_set_vf_vlan(struct net_device *netdev, int vfidx,
2905
2918
struct octeon_device * oct = lio -> oct_dev ;
2906
2919
struct octnic_ctrl_pkt nctrl ;
2907
2920
u16 vlantci ;
2921
+ int ret = 0 ;
2908
2922
2909
2923
if (vfidx < 0 || vfidx >= oct -> sriov_info .num_vfs_alloced )
2910
2924
return - EINVAL ;
@@ -2936,13 +2950,17 @@ static int liquidio_set_vf_vlan(struct net_device *netdev, int vfidx,
2936
2950
nctrl .ncmd .s .more = 0 ;
2937
2951
nctrl .iq_no = lio -> linfo .txpciq [0 ].s .q_no ;
2938
2952
nctrl .cb_fn = NULL ;
2939
- nctrl .wait_time = LIO_CMD_WAIT_TM ;
2940
2953
2941
- octnet_send_nic_ctrl_pkt (oct , & nctrl );
2954
+ ret = octnet_send_nic_ctrl_pkt (oct , & nctrl );
2955
+ if (ret ) {
2956
+ if (ret > 0 )
2957
+ ret = - EIO ;
2958
+ return ret ;
2959
+ }
2942
2960
2943
2961
oct -> sriov_info .vf_vlantci [vfidx ] = vlantci ;
2944
2962
2945
- return 0 ;
2963
+ return ret ;
2946
2964
}
2947
2965
2948
2966
static int liquidio_get_vf_config (struct net_device * netdev , int vfidx ,
@@ -3063,6 +3081,7 @@ static int liquidio_set_vf_link_state(struct net_device *netdev, int vfidx,
3063
3081
struct lio * lio = GET_LIO (netdev );
3064
3082
struct octeon_device * oct = lio -> oct_dev ;
3065
3083
struct octnic_ctrl_pkt nctrl ;
3084
+ int ret = 0 ;
3066
3085
3067
3086
if (vfidx < 0 || vfidx >= oct -> sriov_info .num_vfs_alloced )
3068
3087
return - EINVAL ;
@@ -3078,13 +3097,15 @@ static int liquidio_set_vf_link_state(struct net_device *netdev, int vfidx,
3078
3097
nctrl .ncmd .s .more = 0 ;
3079
3098
nctrl .iq_no = lio -> linfo .txpciq [0 ].s .q_no ;
3080
3099
nctrl .cb_fn = NULL ;
3081
- nctrl .wait_time = LIO_CMD_WAIT_TM ;
3082
3100
3083
- octnet_send_nic_ctrl_pkt (oct , & nctrl );
3101
+ ret = octnet_send_nic_ctrl_pkt (oct , & nctrl );
3084
3102
3085
- oct -> sriov_info .vf_linkstate [vfidx ] = linkstate ;
3103
+ if (!ret )
3104
+ oct -> sriov_info .vf_linkstate [vfidx ] = linkstate ;
3105
+ else if (ret > 0 )
3106
+ ret = - EIO ;
3086
3107
3087
- return 0 ;
3108
+ return ret ;
3088
3109
}
3089
3110
3090
3111
static int
0 commit comments