Module Name: src Committed By: mlelstv Date: Sun Dec 22 18:30:21 UTC 2013
Modified Files: src/sys/dev/usb: umass.c umassvar.h Log Message: Preallocate command and status buffers as auto allocation cannot happen in intrrupt context. To generate a diff of this commit: cvs rdiff -u -r1.147 -r1.148 src/sys/dev/usb/umass.c cvs rdiff -u -r1.34 -r1.35 src/sys/dev/usb/umassvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/umass.c diff -u src/sys/dev/usb/umass.c:1.147 src/sys/dev/usb/umass.c:1.148 --- src/sys/dev/usb/umass.c:1.147 Fri Jan 11 06:22:23 2013 +++ src/sys/dev/usb/umass.c Sun Dec 22 18:30:21 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: umass.c,v 1.147 2013/01/11 06:22:23 skrll Exp $ */ +/* $NetBSD: umass.c,v 1.148 2013/12/22 18:30:21 mlelstv Exp $ */ /* * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -124,7 +124,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.147 2013/01/11 06:22:23 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.148 2013/12/22 18:30:21 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_umass.h" @@ -302,7 +302,7 @@ umass_attach(device_t parent, device_t s const char *sWire, *sCommand; char *devinfop; usbd_status err; - int i, bno, error; + int i, error; sc->sc_dev = self; @@ -558,29 +558,54 @@ umass_attach(device_t parent, device_t s return; } } - /* Allocate buffer for data transfer (it's huge). */ + /* Allocate buffer for data transfer (it's huge), command and + status data here as auto allocation cannot happen in interrupt + context */ switch (sc->sc_wire) { case UMASS_WPROTO_BBB: - bno = XFER_BBB_DATA; - goto dalloc; + sc->data_buffer = usbd_alloc_buffer( + sc->transfer_xfer[XFER_BBB_DATA], + UMASS_MAX_TRANSFER_SIZE); + sc->cmd_buffer = usbd_alloc_buffer( + sc->transfer_xfer[XFER_BBB_CBW], + UMASS_BBB_CBW_SIZE); + sc->s1_buffer = usbd_alloc_buffer( + sc->transfer_xfer[XFER_BBB_CSW1], + UMASS_BBB_CSW_SIZE); + sc->s2_buffer = usbd_alloc_buffer( + sc->transfer_xfer[XFER_BBB_CSW2], + UMASS_BBB_CSW_SIZE); + break; case UMASS_WPROTO_CBI: - bno = XFER_CBI_DATA; - goto dalloc; case UMASS_WPROTO_CBI_I: - bno = XFER_CBI_DATA; - dalloc: - sc->data_buffer = usbd_alloc_buffer(sc->transfer_xfer[bno], - UMASS_MAX_TRANSFER_SIZE); - if (sc->data_buffer == NULL) { - aprint_error_dev(self, "no buffer memory\n"); - umass_disco(sc); - return; - } + sc->data_buffer = usbd_alloc_buffer( + sc->transfer_xfer[XFER_CBI_DATA], + UMASS_MAX_TRANSFER_SIZE); + sc->cmd_buffer = usbd_alloc_buffer( + sc->transfer_xfer[XFER_CBI_CB], + sizeof(sc->cbl)); + sc->s1_buffer = usbd_alloc_buffer( + sc->transfer_xfer[XFER_CBI_STATUS], + sizeof(sc->sbl)); + sc->s2_buffer = usbd_alloc_buffer( + sc->transfer_xfer[XFER_CBI_RESET1], + sizeof(sc->cbl)); break; default: break; } + if (sc->data_buffer == NULL || sc->cmd_buffer == NULL + || sc->s1_buffer == NULL || sc->s2_buffer == NULL) { + /* + * partially preallocated buffers are freed with + * the xfer structures + */ + aprint_error_dev(self, "no buffer memory\n"); + umass_disco(sc); + return; + } + /* Initialise the wire protocol specific methods */ switch (sc->sc_wire) { case UMASS_WPROTO_BBB: Index: src/sys/dev/usb/umassvar.h diff -u src/sys/dev/usb/umassvar.h:1.34 src/sys/dev/usb/umassvar.h:1.35 --- src/sys/dev/usb/umassvar.h:1.34 Fri Aug 24 12:20:02 2012 +++ src/sys/dev/usb/umassvar.h Sun Dec 22 18:30:21 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: umassvar.h,v 1.34 2012/08/24 12:20:02 drochner Exp $ */ +/* $NetBSD: umassvar.h,v 1.35 2013/12/22 18:30:21 mlelstv Exp $ */ /*- * Copyright (c) 1999 MAEKAWA Masahide <bis...@rr.iij4u.or.jp>, @@ -226,6 +226,9 @@ struct umass_softc { usbd_xfer_handle transfer_xfer[XFER_NR]; /* for ctrl xfers */ void *data_buffer; + void *cmd_buffer; + void *s1_buffer; + void *s2_buffer; int transfer_dir; /* data direction */ void *transfer_data; /* data buffer */