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 ---