Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed6f7744 authored by Mike Christie's avatar Mike Christie Committed by James Bottomley
Browse files

[SCSI] cxgb3i: re-read ddp settings information after chip reset



Orignally from Karen Xie, but merge conflicts/errors fixed up by
Mike Christie.

Signed-off-by: default avatarKaren Xie <kxie@chelsio.com>
Signed-off-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 9fa1926a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -141,7 +141,7 @@ int cxgb3i_iscsi_init(void);
void cxgb3i_iscsi_cleanup(void);

struct cxgb3i_adapter *cxgb3i_adapter_find_by_tdev(struct t3cdev *);
struct cxgb3i_adapter *cxgb3i_adapter_open(struct t3cdev *);
void cxgb3i_adapter_open(struct t3cdev *);
void cxgb3i_adapter_close(struct t3cdev *);

struct cxgb3i_hba *cxgb3i_hba_find_by_netdev(struct net_device *);
+69 −45
Original line number Diff line number Diff line
@@ -71,37 +71,34 @@ struct cxgb3i_adapter *cxgb3i_adapter_find_by_tdev(struct t3cdev *tdev)
	return NULL;
}

/**
 * cxgb3i_adapter_open - init a s3 adapter structure and any h/w settings
 * @t3dev: t3cdev adapter
 * return the resulting cxgb3i_adapter struct
 */
struct cxgb3i_adapter *cxgb3i_adapter_open(struct t3cdev *t3dev)
static inline int adapter_update(struct cxgb3i_adapter *snic)
{
	struct cxgb3i_adapter *snic;
	struct adapter *adapter = tdev2adap(t3dev);
	int i;

	snic = kzalloc(sizeof(*snic), GFP_KERNEL);
	if (!snic) {
		cxgb3i_api_debug("cxgb3 %s, OOM.\n", t3dev->name);
		return NULL;
	cxgb3i_log_info("snic 0x%p, t3dev 0x%p, updating.\n",
			snic, snic->tdev);
	return cxgb3i_adapter_ddp_info(snic->tdev, &snic->tag_format,
					&snic->tx_max_size,
					&snic->rx_max_size);
}
	spin_lock_init(&snic->lock);

	snic->tdev = t3dev;
static int adapter_add(struct cxgb3i_adapter *snic)
{
	struct t3cdev *t3dev = snic->tdev;
	struct adapter *adapter = tdev2adap(t3dev);
	int i, err;

	snic->pdev = adapter->pdev;
	snic->tag_format.sw_bits = sw_tag_idx_bits + sw_tag_age_bits;

	if (cxgb3i_adapter_ddp_init(t3dev, &snic->tag_format,
	err = cxgb3i_adapter_ddp_info(t3dev, &snic->tag_format,
				    &snic->tx_max_size,
				    &snic->rx_max_size) < 0)
		goto free_snic;
				    &snic->rx_max_size);
	if (err < 0)
		return err;

	for_each_port(adapter, i) {
		snic->hba[i] = cxgb3i_hba_host_add(snic, adapter->port[i]);
		if (!snic->hba[i])
			goto ulp_cleanup;
			return -EINVAL;
	}
	snic->hba_cnt = adapter->params.nports;

@@ -110,13 +107,40 @@ struct cxgb3i_adapter *cxgb3i_adapter_open(struct t3cdev *t3dev)
	list_add_tail(&snic->list_head, &cxgb3i_snic_list);
	write_unlock(&cxgb3i_snic_rwlock);

	return snic;
	cxgb3i_log_info("t3dev 0x%p open, snic 0x%p, %u scsi hosts added.\n",
			t3dev, snic, snic->hba_cnt);
	return 0;
}

ulp_cleanup:
	cxgb3i_adapter_ddp_cleanup(t3dev);
free_snic:
	kfree(snic);
	return NULL;
/**
 * cxgb3i_adapter_open - init a s3 adapter structure and any h/w settings
 * @t3dev: t3cdev adapter
 */
void cxgb3i_adapter_open(struct t3cdev *t3dev)
{
	struct cxgb3i_adapter *snic = cxgb3i_adapter_find_by_tdev(t3dev);
	int err;

	if (snic)
		err = adapter_update(snic);
	else {
		snic = kzalloc(sizeof(*snic), GFP_KERNEL);
		if (snic) {
			spin_lock_init(&snic->lock);
			snic->tdev = t3dev;
			err = adapter_add(snic);
		} else
			err = -ENOMEM;
	}

	if (err < 0) {
		cxgb3i_log_info("snic 0x%p, f 0x%x, t3dev 0x%p open, err %d.\n",
				snic, snic ? snic->flags : 0, t3dev, err);
		if (snic) {
			snic->flags &= ~CXGB3I_ADAPTER_FLAG_RESET;
			cxgb3i_adapter_close(t3dev);
		}
	}
}

/**
@@ -125,32 +149,30 @@ struct cxgb3i_adapter *cxgb3i_adapter_open(struct t3cdev *t3dev)
 */
void cxgb3i_adapter_close(struct t3cdev *t3dev)
{
	struct cxgb3i_adapter *snic = cxgb3i_adapter_find_by_tdev(t3dev);
	int i;
	struct cxgb3i_adapter *snic;

	if (!snic || snic->flags & CXGB3I_ADAPTER_FLAG_RESET) {
		cxgb3i_log_info("t3dev 0x%p close, snic 0x%p, f 0x%x.\n",
				t3dev, snic, snic ? snic->flags : 0);
		return;
	}

	/* remove from the list */
	write_lock(&cxgb3i_snic_rwlock);
	list_for_each_entry(snic, &cxgb3i_snic_list, list_head) {
		if (snic->tdev == t3dev) {
	list_del(&snic->list_head);
			break;
		}
	}
	write_unlock(&cxgb3i_snic_rwlock);

	if (snic) {
	for (i = 0; i < snic->hba_cnt; i++) {
		if (snic->hba[i]) {
			cxgb3i_hba_host_remove(snic->hba[i]);
			snic->hba[i] = NULL;
		}
	}

		/* release ddp resources */
		cxgb3i_adapter_ddp_cleanup(snic->tdev);
	cxgb3i_log_info("t3dev 0x%p close, snic 0x%p, %u scsi hosts removed.\n",
			t3dev, snic, snic->hba_cnt);
	kfree(snic);
}
}

/**
 * cxgb3i_hba_find_by_netdev - find the cxgb3i_hba structure via net_device
@@ -189,7 +211,8 @@ struct cxgb3i_hba *cxgb3i_hba_host_add(struct cxgb3i_adapter *snic,
	shost = iscsi_host_alloc(&cxgb3i_host_template,
				 sizeof(struct cxgb3i_hba), 1);
	if (!shost) {
		cxgb3i_log_info("iscsi_host_alloc failed.\n");
		cxgb3i_log_info("snic 0x%p, ndev 0x%p, host_alloc failed.\n",
				snic, ndev);
		return NULL;
	}

@@ -207,7 +230,8 @@ struct cxgb3i_hba *cxgb3i_hba_host_add(struct cxgb3i_adapter *snic,
	pci_dev_get(snic->pdev);
	err = iscsi_host_add(shost, &snic->pdev->dev);
	if (err) {
		cxgb3i_log_info("iscsi_host_add failed.\n");
		cxgb3i_log_info("snic 0x%p, ndev 0x%p, host_add failed.\n",
				snic, ndev);
		goto pci_dev_put;
	}