[PATCH RFC only] staging: dgap: fix OOPS on open of port

Greg KH greg at kroah.com
Tue Feb 25 16:48:47 UTC 2014


On Tue, Feb 25, 2014 at 10:56:22AM -0500, Mark Hounschell wrote:
> When opening a port the dgap driver OOPs with a message:
> 
> tty_init_dev: driver does not set tty->port... will crash the kernel... fix the driver... etc...
> 
> Then I have to reboot the box.
> 
> I think before too much more work is done on this driver (by me anyway), 
> it should at least be in a usable state. There are a lot more changes to come 
> and I would like to be able to "test" along the way.
> 
> I've looked at some of the other drivers as examples and come up with this patch that 
> does in fact allow me to use the driver. I would like to submit it but am uncertain that this
> is proper.   
> 
> Thanks for reviewing.
> mark
> 
> diff --git a/drivers/staging/dgap/dgap.c b/drivers/staging/dgap/dgap.c
> index 7cb1ad5..d56b3b2 100644
> --- a/drivers/staging/dgap/dgap.c
> +++ b/drivers/staging/dgap/dgap.c
> @@ -223,7 +223,7 @@ static void dgap_get_vpd(struct board_t *brd);
>  static void dgap_do_reset_board(struct board_t *brd);
>  static void dgap_do_wait_for_bios(struct board_t *brd);
>  static void dgap_do_wait_for_fep(struct board_t *brd);
> -static void dgap_sysfs_create(struct board_t *brd);
> +static int dgap_sysfs_create(struct board_t *brd);
>  static int dgap_firmware_load(struct pci_dev *pdev, int card_type);
>  
>  /* Driver load/unload functions */
> @@ -1098,7 +1098,9 @@ static int dgap_firmware_load(struct pci_dev *pdev, int card_type)
>  		return ret;
>  	}
>  
> -	dgap_sysfs_create(brd);
> +	ret = dgap_sysfs_create(brd);
> +	if (ret)
> +		return ret;

Why are you putting the port initialization logic in the sysfs_create()
function?

Ideally we will get rid of that sysfs logic as a tty driver shouldn't be
creating special sysfs files for no real reason.

>  /*
>   * Create pr and tty device entries
>   */
> -static void dgap_sysfs_create(struct board_t *brd)
> +static int dgap_sysfs_create(struct board_t *brd)

I think the function name is misleading, this does the tty registration,
and you are right to do it here.  Just fix the name :)

>  {
>  	struct channel_t *ch;
> -	int j = 0;
> +	struct dgap_port *p;
> +	int j;
> +
> +	brd->SerialPorts = kcalloc(brd->nasync, sizeof(*brd->SerialPorts),
> +					GFP_KERNEL);
> +	if (brd->SerialPorts == NULL) {
> +		pr_err("dgap: Cannot allocate serial port memory\n");
> +		return -ENOMEM;
> +	}
> +
> +	for (j = 0, p = brd->SerialPorts; j < brd->nasync; j++, p++)
> +		tty_port_init(&p->port);
> +
> +	brd->PrinterPorts = kcalloc(brd->nasync, sizeof(*brd->PrinterPorts),
> +					GFP_KERNEL);

What are "printer ports"?  How are they different from "serial ports" on
this device?

> +struct dgap_port {
> +	struct tty_port port;
> +};

Do you really need a wrapping structure here?

thanks,

greg k-h


More information about the devel mailing list