@@ -1079,67 +1079,28 @@ static void ncsi_probe_channel(struct ncsi_dev_priv *ndp)
1079
1079
nd -> state = ncsi_dev_state_probe_package ;
1080
1080
break ;
1081
1081
case ncsi_dev_state_probe_package :
1082
- ndp -> pending_req_num = 16 ;
1082
+ ndp -> pending_req_num = 1 ;
1083
1083
1084
- /* Select all possible packages */
1085
1084
nca .type = NCSI_PKT_CMD_SP ;
1086
1085
nca .bytes [0 ] = 1 ;
1086
+ nca .package = ndp -> package_probe_id ;
1087
1087
nca .channel = NCSI_RESERVED_CHANNEL ;
1088
- for (index = 0 ; index < 8 ; index ++ ) {
1089
- nca .package = index ;
1090
- ret = ncsi_xmit_cmd (& nca );
1091
- if (ret )
1092
- goto error ;
1093
- }
1094
-
1095
- /* Disable all possible packages */
1096
- nca .type = NCSI_PKT_CMD_DP ;
1097
- for (index = 0 ; index < 8 ; index ++ ) {
1098
- nca .package = index ;
1099
- ret = ncsi_xmit_cmd (& nca );
1100
- if (ret )
1101
- goto error ;
1102
- }
1103
-
1088
+ ret = ncsi_xmit_cmd (& nca );
1089
+ if (ret )
1090
+ goto error ;
1104
1091
nd -> state = ncsi_dev_state_probe_channel ;
1105
1092
break ;
1106
1093
case ncsi_dev_state_probe_channel :
1107
- if (!ndp -> active_package )
1108
- ndp -> active_package = list_first_or_null_rcu (
1109
- & ndp -> packages , struct ncsi_package , node );
1110
- else if (list_is_last (& ndp -> active_package -> node ,
1111
- & ndp -> packages ))
1112
- ndp -> active_package = NULL ;
1113
- else
1114
- ndp -> active_package = list_next_entry (
1115
- ndp -> active_package , node );
1116
-
1117
- /* All available packages and channels are enumerated. The
1118
- * enumeration happens for once when the NCSI interface is
1119
- * started. So we need continue to start the interface after
1120
- * the enumeration.
1121
- *
1122
- * We have to choose an active channel before configuring it.
1123
- * Note that we possibly don't have active channel in extreme
1124
- * situation.
1125
- */
1094
+ ndp -> active_package = ncsi_find_package (ndp ,
1095
+ ndp -> package_probe_id );
1126
1096
if (!ndp -> active_package ) {
1127
- ndp -> flags |= NCSI_DEV_PROBED ;
1128
- ncsi_choose_active_channel (ndp );
1129
- return ;
1097
+ /* No response */
1098
+ nd -> state = ncsi_dev_state_probe_dp ;
1099
+ schedule_work (& ndp -> work );
1100
+ break ;
1130
1101
}
1131
-
1132
- /* Select the active package */
1133
- ndp -> pending_req_num = 1 ;
1134
- nca .type = NCSI_PKT_CMD_SP ;
1135
- nca .bytes [0 ] = 1 ;
1136
- nca .package = ndp -> active_package -> id ;
1137
- nca .channel = NCSI_RESERVED_CHANNEL ;
1138
- ret = ncsi_xmit_cmd (& nca );
1139
- if (ret )
1140
- goto error ;
1141
-
1142
1102
nd -> state = ncsi_dev_state_probe_cis ;
1103
+ schedule_work (& ndp -> work );
1143
1104
break ;
1144
1105
case ncsi_dev_state_probe_cis :
1145
1106
ndp -> pending_req_num = NCSI_RESERVED_CHANNEL ;
@@ -1188,22 +1149,35 @@ static void ncsi_probe_channel(struct ncsi_dev_priv *ndp)
1188
1149
case ncsi_dev_state_probe_dp :
1189
1150
ndp -> pending_req_num = 1 ;
1190
1151
1191
- /* Deselect the active package */
1152
+ /* Deselect the current package */
1192
1153
nca .type = NCSI_PKT_CMD_DP ;
1193
- nca .package = ndp -> active_package -> id ;
1154
+ nca .package = ndp -> package_probe_id ;
1194
1155
nca .channel = NCSI_RESERVED_CHANNEL ;
1195
1156
ret = ncsi_xmit_cmd (& nca );
1196
1157
if (ret )
1197
1158
goto error ;
1198
1159
1199
- /* Scan channels in next package */
1200
- nd -> state = ncsi_dev_state_probe_channel ;
1160
+ /* Probe next package */
1161
+ ndp -> package_probe_id ++ ;
1162
+ if (ndp -> package_probe_id >= 8 ) {
1163
+ /* Probe finished */
1164
+ ndp -> flags |= NCSI_DEV_PROBED ;
1165
+ break ;
1166
+ }
1167
+ nd -> state = ncsi_dev_state_probe_package ;
1168
+ ndp -> active_package = NULL ;
1201
1169
break ;
1202
1170
default :
1203
1171
netdev_warn (nd -> dev , "Wrong NCSI state 0x%0x in enumeration\n" ,
1204
1172
nd -> state );
1205
1173
}
1206
1174
1175
+ if (ndp -> flags & NCSI_DEV_PROBED ) {
1176
+ /* Check if all packages have HWA support */
1177
+ ncsi_check_hwa (ndp );
1178
+ ncsi_choose_active_channel (ndp );
1179
+ }
1180
+
1207
1181
return ;
1208
1182
error :
1209
1183
netdev_err (ndp -> ndev .dev ,
@@ -1564,6 +1538,7 @@ int ncsi_start_dev(struct ncsi_dev *nd)
1564
1538
return - ENOTTY ;
1565
1539
1566
1540
if (!(ndp -> flags & NCSI_DEV_PROBED )) {
1541
+ ndp -> package_probe_id = 0 ;
1567
1542
nd -> state = ncsi_dev_state_probe ;
1568
1543
schedule_work (& ndp -> work );
1569
1544
return 0 ;
0 commit comments