ncsi-manage.c (60ab49bfe4fa576c5b1d98b9dfc523bfcb3c610c) | ncsi-manage.c (8e13f70be05ee49985dfc3c766868bc85ed43b8a) |
---|---|
1/* 2 * Copyright Gavin Shan, IBM Corporation 2016. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 */ --- 1065 unchanged lines hidden (view full) --- 1074 ret = ncsi_xmit_cmd(&nca); 1075 if (ret) 1076 goto error; 1077 } 1078 1079 nd->state = ncsi_dev_state_probe_package; 1080 break; 1081 case ncsi_dev_state_probe_package: | 1/* 2 * Copyright Gavin Shan, IBM Corporation 2016. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 */ --- 1065 unchanged lines hidden (view full) --- 1074 ret = ncsi_xmit_cmd(&nca); 1075 if (ret) 1076 goto error; 1077 } 1078 1079 nd->state = ncsi_dev_state_probe_package; 1080 break; 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 nca.type = NCSI_PKT_CMD_SP; 1086 nca.bytes[0] = 1; | 1084 nca.type = NCSI_PKT_CMD_SP; 1085 nca.bytes[0] = 1; |
1086 nca.package = ndp->package_probe_id; |
|
1087 nca.channel = NCSI_RESERVED_CHANNEL; | 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 nd->state = ncsi_dev_state_probe_channel; 1105 break; 1106 case ncsi_dev_state_probe_channel: | 1091 nd->state = ncsi_dev_state_probe_channel; 1092 break; 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 if (!ndp->active_package) { | 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 nd->state = ncsi_dev_state_probe_cis; | 1102 nd->state = ncsi_dev_state_probe_cis; |
1103 schedule_work(&ndp->work); |
|
1143 break; 1144 case ncsi_dev_state_probe_cis: 1145 ndp->pending_req_num = NCSI_RESERVED_CHANNEL; 1146 1147 /* Clear initial state */ 1148 nca.type = NCSI_PKT_CMD_CIS; 1149 nca.package = ndp->active_package->id; 1150 for (index = 0; index < NCSI_RESERVED_CHANNEL; index++) { --- 32 unchanged lines hidden (view full) --- 1183 else if (nd->state == ncsi_dev_state_probe_gc) 1184 nd->state = ncsi_dev_state_probe_gls; 1185 else 1186 nd->state = ncsi_dev_state_probe_dp; 1187 break; 1188 case ncsi_dev_state_probe_dp: 1189 ndp->pending_req_num = 1; 1190 | 1104 break; 1105 case ncsi_dev_state_probe_cis: 1106 ndp->pending_req_num = NCSI_RESERVED_CHANNEL; 1107 1108 /* Clear initial state */ 1109 nca.type = NCSI_PKT_CMD_CIS; 1110 nca.package = ndp->active_package->id; 1111 for (index = 0; index < NCSI_RESERVED_CHANNEL; index++) { --- 32 unchanged lines hidden (view full) --- 1144 else if (nd->state == ncsi_dev_state_probe_gc) 1145 nd->state = ncsi_dev_state_probe_gls; 1146 else 1147 nd->state = ncsi_dev_state_probe_dp; 1148 break; 1149 case ncsi_dev_state_probe_dp: 1150 ndp->pending_req_num = 1; 1151 |
1191 /* Deselect the active package */ | 1152 /* Deselect the current package */ |
1192 nca.type = NCSI_PKT_CMD_DP; | 1153 nca.type = NCSI_PKT_CMD_DP; |
1193 nca.package = ndp->active_package->id; | 1154 nca.package = ndp->package_probe_id; |
1194 nca.channel = NCSI_RESERVED_CHANNEL; 1195 ret = ncsi_xmit_cmd(&nca); 1196 if (ret) 1197 goto error; 1198 | 1155 nca.channel = NCSI_RESERVED_CHANNEL; 1156 ret = ncsi_xmit_cmd(&nca); 1157 if (ret) 1158 goto error; 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 break; 1202 default: 1203 netdev_warn(nd->dev, "Wrong NCSI state 0x%0x in enumeration\n", 1204 nd->state); 1205 } 1206 | 1169 break; 1170 default: 1171 netdev_warn(nd->dev, "Wrong NCSI state 0x%0x in enumeration\n", 1172 nd->state); 1173 } 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 return; 1208error: 1209 netdev_err(ndp->ndev.dev, 1210 "NCSI: Failed to transmit cmd 0x%x during probe\n", 1211 nca.type); 1212 ncsi_report_link(ndp, true); 1213} 1214 --- 344 unchanged lines hidden (view full) --- 1559{ 1560 struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd); 1561 1562 if (nd->state != ncsi_dev_state_registered && 1563 nd->state != ncsi_dev_state_functional) 1564 return -ENOTTY; 1565 1566 if (!(ndp->flags & NCSI_DEV_PROBED)) { | 1181 return; 1182error: 1183 netdev_err(ndp->ndev.dev, 1184 "NCSI: Failed to transmit cmd 0x%x during probe\n", 1185 nca.type); 1186 ncsi_report_link(ndp, true); 1187} 1188 --- 344 unchanged lines hidden (view full) --- 1533{ 1534 struct ncsi_dev_priv *ndp = TO_NCSI_DEV_PRIV(nd); 1535 1536 if (nd->state != ncsi_dev_state_registered && 1537 nd->state != ncsi_dev_state_functional) 1538 return -ENOTTY; 1539 1540 if (!(ndp->flags & NCSI_DEV_PROBED)) { |
1541 ndp->package_probe_id = 0; |
|
1567 nd->state = ncsi_dev_state_probe; 1568 schedule_work(&ndp->work); 1569 return 0; 1570 } 1571 1572 return ncsi_choose_active_channel(ndp); 1573} 1574EXPORT_SYMBOL_GPL(ncsi_start_dev); --- 55 unchanged lines hidden --- | 1542 nd->state = ncsi_dev_state_probe; 1543 schedule_work(&ndp->work); 1544 return 0; 1545 } 1546 1547 return ncsi_choose_active_channel(ndp); 1548} 1549EXPORT_SYMBOL_GPL(ncsi_start_dev); --- 55 unchanged lines hidden --- |