|
@@ -151,9 +151,7 @@ static ssize_t i40e_dbg_dump_write(struct file *filp,
|
|
|
size_t count, loff_t *ppos)
|
|
|
{
|
|
|
struct i40e_pf *pf = filp->private_data;
|
|
|
- char dump_request_buf[16];
|
|
|
bool seid_found = false;
|
|
|
- int bytes_not_copied;
|
|
|
long seid = -1;
|
|
|
int buflen = 0;
|
|
|
int i, ret;
|
|
@@ -163,21 +161,12 @@ static ssize_t i40e_dbg_dump_write(struct file *filp,
|
|
|
/* don't allow partial writes */
|
|
|
if (*ppos != 0)
|
|
|
return 0;
|
|
|
- if (count >= sizeof(dump_request_buf))
|
|
|
- return -ENOSPC;
|
|
|
-
|
|
|
- bytes_not_copied = copy_from_user(dump_request_buf, buffer, count);
|
|
|
- if (bytes_not_copied < 0)
|
|
|
- return bytes_not_copied;
|
|
|
- if (bytes_not_copied > 0)
|
|
|
- count -= bytes_not_copied;
|
|
|
- dump_request_buf[count] = '\0';
|
|
|
|
|
|
/* decode the SEID given to be dumped */
|
|
|
- ret = kstrtol(dump_request_buf, 0, &seid);
|
|
|
- if (ret < 0) {
|
|
|
- dev_info(&pf->pdev->dev, "bad seid value '%s'\n",
|
|
|
- dump_request_buf);
|
|
|
+ ret = kstrtol_from_user(buffer, count, 0, &seid);
|
|
|
+
|
|
|
+ if (ret) {
|
|
|
+ dev_info(&pf->pdev->dev, "bad seid value\n");
|
|
|
} else if (seid == 0) {
|
|
|
seid_found = true;
|
|
|
|
|
@@ -245,26 +234,33 @@ static ssize_t i40e_dbg_dump_write(struct file *filp,
|
|
|
memcpy(p, vsi, len);
|
|
|
p += len;
|
|
|
|
|
|
- len = (sizeof(struct i40e_q_vector)
|
|
|
- * vsi->num_q_vectors);
|
|
|
- memcpy(p, vsi->q_vectors, len);
|
|
|
- p += len;
|
|
|
-
|
|
|
- len = (sizeof(struct i40e_ring) * vsi->num_queue_pairs);
|
|
|
- memcpy(p, vsi->tx_rings, len);
|
|
|
- p += len;
|
|
|
- memcpy(p, vsi->rx_rings, len);
|
|
|
- p += len;
|
|
|
+ if (vsi->num_q_vectors) {
|
|
|
+ len = (sizeof(struct i40e_q_vector)
|
|
|
+ * vsi->num_q_vectors);
|
|
|
+ memcpy(p, vsi->q_vectors, len);
|
|
|
+ p += len;
|
|
|
+ }
|
|
|
|
|
|
- for (i = 0; i < vsi->num_queue_pairs; i++) {
|
|
|
- len = sizeof(struct i40e_tx_buffer);
|
|
|
- memcpy(p, vsi->tx_rings[i]->tx_bi, len);
|
|
|
+ if (vsi->num_queue_pairs) {
|
|
|
+ len = (sizeof(struct i40e_ring) *
|
|
|
+ vsi->num_queue_pairs);
|
|
|
+ memcpy(p, vsi->tx_rings, len);
|
|
|
+ p += len;
|
|
|
+ memcpy(p, vsi->rx_rings, len);
|
|
|
p += len;
|
|
|
}
|
|
|
- for (i = 0; i < vsi->num_queue_pairs; i++) {
|
|
|
+
|
|
|
+ if (vsi->tx_rings[0]) {
|
|
|
+ len = sizeof(struct i40e_tx_buffer);
|
|
|
+ for (i = 0; i < vsi->num_queue_pairs; i++) {
|
|
|
+ memcpy(p, vsi->tx_rings[i]->tx_bi, len);
|
|
|
+ p += len;
|
|
|
+ }
|
|
|
len = sizeof(struct i40e_rx_buffer);
|
|
|
- memcpy(p, vsi->rx_rings[i]->rx_bi, len);
|
|
|
- p += len;
|
|
|
+ for (i = 0; i < vsi->num_queue_pairs; i++) {
|
|
|
+ memcpy(p, vsi->rx_rings[i]->rx_bi, len);
|
|
|
+ p += len;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* macvlan filter list */
|
|
@@ -1023,11 +1019,11 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|
|
size_t count, loff_t *ppos)
|
|
|
{
|
|
|
struct i40e_pf *pf = filp->private_data;
|
|
|
+ char *cmd_buf, *cmd_buf_tmp;
|
|
|
int bytes_not_copied;
|
|
|
struct i40e_vsi *vsi;
|
|
|
u8 *print_buf_start;
|
|
|
u8 *print_buf;
|
|
|
- char *cmd_buf;
|
|
|
int vsi_seid;
|
|
|
int veb_seid;
|
|
|
int cnt;
|
|
@@ -1046,6 +1042,12 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|
|
count -= bytes_not_copied;
|
|
|
cmd_buf[count] = '\0';
|
|
|
|
|
|
+ cmd_buf_tmp = strchr(cmd_buf, '\n');
|
|
|
+ if (cmd_buf_tmp) {
|
|
|
+ *cmd_buf_tmp = '\0';
|
|
|
+ count = cmd_buf_tmp - cmd_buf + 1;
|
|
|
+ }
|
|
|
+
|
|
|
print_buf_start = kzalloc(I40E_MAX_DEBUG_OUT_BUFFER, GFP_KERNEL);
|
|
|
if (!print_buf_start)
|
|
|
goto command_write_done;
|
|
@@ -1152,9 +1154,9 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|
|
i40e_veb_release(pf->veb[i]);
|
|
|
|
|
|
} else if (strncmp(cmd_buf, "add macaddr", 11) == 0) {
|
|
|
- u8 ma[6];
|
|
|
- int vlan = 0;
|
|
|
struct i40e_mac_filter *f;
|
|
|
+ int vlan = 0;
|
|
|
+ u8 ma[6];
|
|
|
int ret;
|
|
|
|
|
|
cnt = sscanf(&cmd_buf[11],
|
|
@@ -1190,8 +1192,8 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|
|
ma, vlan, vsi_seid, f, ret);
|
|
|
|
|
|
} else if (strncmp(cmd_buf, "del macaddr", 11) == 0) {
|
|
|
- u8 ma[6];
|
|
|
int vlan = 0;
|
|
|
+ u8 ma[6];
|
|
|
int ret;
|
|
|
|
|
|
cnt = sscanf(&cmd_buf[11],
|
|
@@ -1227,9 +1229,9 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|
|
ma, vlan, vsi_seid, ret);
|
|
|
|
|
|
} else if (strncmp(cmd_buf, "add pvid", 8) == 0) {
|
|
|
- int v;
|
|
|
- u16 vid;
|
|
|
i40e_status ret;
|
|
|
+ u16 vid;
|
|
|
+ int v;
|
|
|
|
|
|
cnt = sscanf(&cmd_buf[8], "%i %u", &vsi_seid, &v);
|
|
|
if (cnt != 2) {
|
|
@@ -1540,10 +1542,10 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|
|
} else if ((strncmp(cmd_buf, "add fd_filter", 13) == 0) ||
|
|
|
(strncmp(cmd_buf, "rem fd_filter", 13) == 0)) {
|
|
|
struct i40e_fdir_data fd_data;
|
|
|
- int ret;
|
|
|
u16 packet_len, i, j = 0;
|
|
|
char *asc_packet;
|
|
|
bool add = false;
|
|
|
+ int ret;
|
|
|
|
|
|
asc_packet = kzalloc(I40E_FDIR_MAX_RAW_PACKET_LOOKUP,
|
|
|
GFP_KERNEL);
|
|
@@ -1631,9 +1633,9 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|
|
}
|
|
|
} else if (strncmp(&cmd_buf[5],
|
|
|
"get local", 9) == 0) {
|
|
|
+ u16 llen, rlen;
|
|
|
int ret, i;
|
|
|
u8 *buff;
|
|
|
- u16 llen, rlen;
|
|
|
buff = kzalloc(I40E_LLDPDU_SIZE, GFP_KERNEL);
|
|
|
if (!buff)
|
|
|
goto command_write_done;
|
|
@@ -1664,9 +1666,9 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|
|
kfree(buff);
|
|
|
buff = NULL;
|
|
|
} else if (strncmp(&cmd_buf[5], "get remote", 10) == 0) {
|
|
|
+ u16 llen, rlen;
|
|
|
int ret, i;
|
|
|
u8 *buff;
|
|
|
- u16 llen, rlen;
|
|
|
buff = kzalloc(I40E_LLDPDU_SIZE, GFP_KERNEL);
|
|
|
if (!buff)
|
|
|
goto command_write_done;
|
|
@@ -1742,11 +1744,13 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
|
|
|
goto command_write_done;
|
|
|
}
|
|
|
|
|
|
- /* Read at least 512 words */
|
|
|
- if (buffer_len == 0)
|
|
|
- buffer_len = 512;
|
|
|
+ /* set the max length */
|
|
|
+ buffer_len = min_t(u16, buffer_len, I40E_MAX_AQ_BUF_SIZE/2);
|
|
|
|
|
|
bytes = 2 * buffer_len;
|
|
|
+
|
|
|
+ /* read at least 1k bytes, no more than 4kB */
|
|
|
+ bytes = clamp(bytes, (u16)1024, (u16)I40E_MAX_AQ_BUF_SIZE);
|
|
|
buff = kzalloc(bytes, GFP_KERNEL);
|
|
|
if (!buff)
|
|
|
goto command_write_done;
|
|
@@ -1898,6 +1902,7 @@ static ssize_t i40e_dbg_netdev_ops_write(struct file *filp,
|
|
|
struct i40e_pf *pf = filp->private_data;
|
|
|
int bytes_not_copied;
|
|
|
struct i40e_vsi *vsi;
|
|
|
+ char *buf_tmp;
|
|
|
int vsi_seid;
|
|
|
int i, cnt;
|
|
|
|
|
@@ -1916,6 +1921,12 @@ static ssize_t i40e_dbg_netdev_ops_write(struct file *filp,
|
|
|
count -= bytes_not_copied;
|
|
|
i40e_dbg_netdev_ops_buf[count] = '\0';
|
|
|
|
|
|
+ buf_tmp = strchr(i40e_dbg_netdev_ops_buf, '\n');
|
|
|
+ if (buf_tmp) {
|
|
|
+ *buf_tmp = '\0';
|
|
|
+ count = buf_tmp - i40e_dbg_netdev_ops_buf + 1;
|
|
|
+ }
|
|
|
+
|
|
|
if (strncmp(i40e_dbg_netdev_ops_buf, "tx_timeout", 10) == 0) {
|
|
|
cnt = sscanf(&i40e_dbg_netdev_ops_buf[11], "%i", &vsi_seid);
|
|
|
if (cnt != 1) {
|
|
@@ -2019,21 +2030,35 @@ static const struct file_operations i40e_dbg_netdev_ops_fops = {
|
|
|
**/
|
|
|
void i40e_dbg_pf_init(struct i40e_pf *pf)
|
|
|
{
|
|
|
- struct dentry *pfile __attribute__((unused));
|
|
|
+ struct dentry *pfile;
|
|
|
const char *name = pci_name(pf->pdev);
|
|
|
+ const struct device *dev = &pf->pdev->dev;
|
|
|
|
|
|
pf->i40e_dbg_pf = debugfs_create_dir(name, i40e_dbg_root);
|
|
|
- if (pf->i40e_dbg_pf) {
|
|
|
- pfile = debugfs_create_file("command", 0600, pf->i40e_dbg_pf,
|
|
|
- pf, &i40e_dbg_command_fops);
|
|
|
- pfile = debugfs_create_file("dump", 0600, pf->i40e_dbg_pf, pf,
|
|
|
- &i40e_dbg_dump_fops);
|
|
|
- pfile = debugfs_create_file("netdev_ops", 0600, pf->i40e_dbg_pf,
|
|
|
- pf, &i40e_dbg_netdev_ops_fops);
|
|
|
- } else {
|
|
|
- dev_info(&pf->pdev->dev,
|
|
|
- "debugfs entry for %s failed\n", name);
|
|
|
- }
|
|
|
+ if (!pf->i40e_dbg_pf)
|
|
|
+ return;
|
|
|
+
|
|
|
+ pfile = debugfs_create_file("command", 0600, pf->i40e_dbg_pf, pf,
|
|
|
+ &i40e_dbg_command_fops);
|
|
|
+ if (!pfile)
|
|
|
+ goto create_failed;
|
|
|
+
|
|
|
+ pfile = debugfs_create_file("dump", 0600, pf->i40e_dbg_pf, pf,
|
|
|
+ &i40e_dbg_dump_fops);
|
|
|
+ if (!pfile)
|
|
|
+ goto create_failed;
|
|
|
+
|
|
|
+ pfile = debugfs_create_file("netdev_ops", 0600, pf->i40e_dbg_pf, pf,
|
|
|
+ &i40e_dbg_netdev_ops_fops);
|
|
|
+ if (!pfile)
|
|
|
+ goto create_failed;
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+create_failed:
|
|
|
+ dev_info(dev, "debugfs dir/file for %s failed\n", name);
|
|
|
+ debugfs_remove_recursive(pf->i40e_dbg_pf);
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
/**
|