netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ben Hutchings <bhutchings@solarflare.com>
To: Ron Mercer <ron.mercer@qlogic.com>
Cc: jeff@garzik.org, netdev@vger.kernel.org
Subject: Re: [PATCH 2/6] [RFC] qlge: New Driver: Adding main driver file qlge_main.c.
Date: Tue, 26 Aug 2008 12:24:21 +0100	[thread overview]
Message-ID: <20080826112420.GY7908@solarflare.com> (raw)
In-Reply-To: <12194364662050-git-send-email-ron.mercer@qlogic.com>

Ron Mercer wrote:
> 
> Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
> ---
>  drivers/net/qlge/qlge_main.c | 4350 ++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 4350 insertions(+), 0 deletions(-)
>  create mode 100755 drivers/net/qlge/qlge_main.c
> 
> diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
> new file mode 100755
> index 0000000..0aa472f
> --- /dev/null
> +++ b/drivers/net/qlge/qlge_main.c
[...]
> +#include <linux/version.h>

Should never be used in an in-tree driver.  (Doesn't checkpatch.pl warn
about this?)

[...]
> +#if 0
> +static int ql_update_ring_coalescing(struct ql_adapter *qdev)
> +{

Why are all the ethtool operation implementations disabled?  If they are
broken in some way, I think they should be left out now and added later.

[...]
> +static void ql_update_buffer_queues(struct ql_adapter *qdev,
> +				    struct rx_ring *rx_ring)
> +{
> +	if (rx_ring->sbq_len) ql_update_sbq(qdev, rx_ring);
> +	if (rx_ring->lbq_len) ql_update_lbq(qdev, rx_ring);
> +}

The body of an if-statement always starts on the next line, as checkpatch.pl
will tell you.

[...]
> +static void ql_enable_msix(struct ql_adapter *qdev)
> +{
> +	int i;
> +
> +	qdev->intr_count = 1;
> +	/* Get the MSIX vectors. */
> +	if (irq_type == MSIX_IRQ) {
> +		/* Try to alloc space for the msix struct,
> +		 * if it fails then go to MSI/legacy.
> +		 */
> +		qdev->msi_x_entry = kcalloc(qdev->rx_ring_count,
> +					    sizeof(struct msix_entry),
> +					    GFP_KERNEL);
> +		if (!qdev->msi_x_entry) {
> +			irq_type = MSI_IRQ;
> +			goto msi;
> +		}
> +
> +		for (i = 0; i < qdev->rx_ring_count; i++)
> +			qdev->msi_x_entry[i].entry = i;
> +
> +		if (!pci_enable_msix
> +		    (qdev->pdev, qdev->msi_x_entry, qdev->rx_ring_count)) {
> +			set_bit(QL_MSIX_ENABLED, &qdev->flags);
> +			qdev->intr_count = qdev->rx_ring_count;
> +			QPRINTK(IFUP, INFO,
> +				"MSI-X Enabled, got %d vectors.\n",
> +				qdev->intr_count);
> +			return;
> +		} else {
> +			kfree(qdev->msi_x_entry);
> +			qdev->msi_x_entry = NULL;
> +			QPRINTK(IFUP, WARNING,
> +				"MSI-X Enable failed, trying MSI.\n");
> +			irq_type = MSI_IRQ;

If pci_enable_msix() returns a positive number, that's a hint as to how
many IRQs you should be able to allocate.  It may be worth retrying with
that number.

[...]
> +static int ql_adapter_initialize(struct ql_adapter *qdev)
> +{
> +	u32 value, mask;
> +	int i;
> +	int status = 0;
> +
> +	/*
> +	 * Set up the System register to halt on errors.
> +	 */
> +	value = SYS_EFE | SYS_FAE;
> +	mask = value << 16;
> +	ql_write32(qdev, SYS, mask | value);
> +
> +	/* Set the default queue. */
> +	value = NIC_RCV_CFG_DFQ;
> +	mask = NIC_RCV_CFG_DFQ_MASK;
> +	ql_write32(qdev, NIC_RCV_CFG, (mask | value));
> +
> +	/* Set the MPI interrupt to enabled. */
> +	ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI);
> +
> +	/* Enable the function, set pagesize, enable error checking. */
> +	value = FSC_FE | FSC_EPC_INBOUND | FSC_EPC_OUTBOUND | FSC_EC;
> +
> +	if (PAGE_SHIFT == 12)	/* 4k pages */
> +		value |= FSC_VM_PAGE_4K;
> +	else if (PAGE_SHIFT == 13)	/* 8k pages */
> +		value |= FSC_VM_PAGE_8K;
> +	else if (PAGE_SHIFT == 16)	/* 64k pages */
> +		value |= FSC_VM_PAGE_64K;
> +	else {
> +		QPRINTK(IFUP, ERR, "Invalid page size of %d.\n",
> +			1 << PAGE_SHIFT);

You can use
	BUILD_BUG_ON(PAGE_SHIFT != 12 && PAGE_SHIFT != 13 && PAGE_SHIFT != 16);
to detect this problem at compile time.

Why doesn't this function do any cleanup in case of failure part way
through?

[...]
> +static int ql_configure_rings(struct ql_adapter *qdev)
> +{
> +	int i;
> +	struct rx_ring *rx_ring;
> +	struct tx_ring *tx_ring;
> +	int cpu_cnt = num_online_cpus();
> +
> +	/*
> +	 * For each processor present we allocate one
> +	 * rx_ring for outbound completions, and one

Typo: should be "tx_ring".

[...]
> +static int qlge_change_mtu(struct net_device *ndev, int new_mtu)
> +{
> +	struct ql_adapter *qdev = netdev_priv(ndev);
> +
> +	if (ndev->mtu == 1500 && new_mtu == 9000) {
> +		QPRINTK(IFUP, ERR, "Turning on split headers.\n");
> +		ql_write32(qdev, FSC, (FSC_SH << 16) | FSC_SH);
> +		if (ql_set_framesize(qdev, JUMBO_FRAME_SIZE))
> +			return -EIO;
> +	} else if (ndev->mtu == 9000 && new_mtu == 1500) {
> +		QPRINTK(IFUP, ERR, "Turning off split headers.\n");
> +		ql_write32(qdev, FSC, (FSC_SH << 16));
> +		if (ql_set_framesize(qdev, NORMAL_FRAME_SIZE))
> +			return -EIO;
> +	} else if ((ndev->mtu == 1500 && new_mtu == 1500) ||
> +		   (ndev->mtu == 9000 && new_mtu == 9000)) {
> +		return 0;
> +	} else
> +		return -EINVAL;
[...]

This would be a whole lot easier to follow if written as:

	if (ndev->mtu == new_mtu)
		return 0;
	else if (new_mtu == 1500)
		...
	else if (new_mtu == 9000)
		...
	else
		return -EINVAL;

But why don't you support MTUs other than 1500 and 9000?

Ben.

-- 
Ben Hutchings, Senior Software Engineer, Solarflare Communications
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

  reply	other threads:[~2008-08-26 11:24 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-21 18:54 [RFC] New Qlogic 10Gb Ethernet driver for 2.6.28 Ron Mercer
2008-08-21 19:48 ` Ben Hutchings
2008-08-22  9:14   ` Jeff Garzik
2008-08-22 17:43     ` Ron Mercer
2008-08-22  9:22 ` Jeff Garzik
2008-08-22  9:42   ` David Miller
2008-08-22 17:46     ` Ron Mercer
2008-08-22 21:43       ` David Miller
2008-08-25 17:01         ` Ron Mercer
2008-08-25 21:05           ` David Miller
2008-08-26  9:36           ` Ben Hutchings
2008-08-22 17:42   ` Ron Mercer
2008-08-22 20:09 ` [RFC] qlge: " Ron Mercer
2008-08-22 20:21   ` [PATCH 1/6] [RFC] qlge: New Driver: Makefile and Kconfig changes Ron Mercer
2008-08-22 20:21   ` [PATCH 2/6] [RFC] qlge: New Driver: Adding main driver file qlge_main.c Ron Mercer
2008-08-26 11:24     ` Ben Hutchings [this message]
2008-08-26 16:51       ` Ron Mercer
2008-08-27 14:11       ` Ron Mercer
2008-08-22 20:21   ` [PATCH 3/6] [RFC] qlge: New Driver: Added management file qlge_mpi.c Ron Mercer
2008-08-22 20:21   ` [PATCH 4/6] [RFC] qlge: New Driver: Adding ethtool file qlge_ethtool.c Ron Mercer
2008-08-22 20:21   ` [PATCH 5/6] [RFC] qlge: New Driver: Adding driver header file qlge.h Ron Mercer
2008-08-26 11:00     ` Ben Hutchings
2008-08-22 20:21   ` [PATCH 6/6] [RFC] qlge: New Driver: Adding makefile Ron Mercer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080826112420.GY7908@solarflare.com \
    --to=bhutchings@solarflare.com \
    --cc=jeff@garzik.org \
    --cc=netdev@vger.kernel.org \
    --cc=ron.mercer@qlogic.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).