Another allocation/memory use made big mem friendly.
.... Ken
Index: ahci.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/ahci.c,v
retrieving revision 1.172
diff -u -p -r1.172 ahci.c
--- ahci.c 28 Jan 2011 06:32:31 -0000 1.172
+++ ahci.c 3 Apr 2011 13:35:05 -0000
@@ -27,6 +27,7 @@
#include <sys/timeout.h>
#include <sys/queue.h>
#include <sys/mutex.h>
+#include <sys/pool.h>
#include <machine/bus.h>
@@ -391,8 +392,6 @@ struct ahci_port {
u_int32_t ap_err_saved_active;
u_int32_t ap_err_saved_active_cnt;
- u_int8_t ap_err_scratch[512];
-
#ifdef AHCI_DEBUG
char ap_name[16];
#define PORTNAME(_ap) ((_ap)->ap_name)
@@ -3098,9 +3097,10 @@ ahci_port_read_ncq_error(struct ahci_por
{
struct ahci_ccb *ccb;
struct ahci_cmd_hdr *cmd_slot;
- u_int32_t cmd;
+ u_int8_t *ap_err_scratch = NULL;
struct ata_fis_h2d *fis;
int rc = EIO;
+ u_int32_t cmd;
DPRINTF(AHCI_D_VERBOSE, "%s: read log page\n", PORTNAME(ap));
@@ -3112,10 +3112,11 @@ ahci_port_read_ncq_error(struct ahci_por
ahci_port_start(ap, 0);
/* Prep error CCB for READ LOG EXT, page 10h, 1 sector. */
+ ap_err_scratch = dma_alloc(DEV_BSIZE, PR_WAITOK | PR_ZERO);
ccb = ahci_get_err_ccb(ap);
ccb->ccb_xa.flags = ATA_F_NOWAIT | ATA_F_READ | ATA_F_POLL;
- ccb->ccb_xa.data = ap->ap_err_scratch;
- ccb->ccb_xa.datalen = 512;
+ ccb->ccb_xa.data = ap_err_scratch;
+ ccb->ccb_xa.datalen = DEV_BSIZE;
cmd_slot = ccb->ccb_cmd_hdr;
bzero(ccb->ccb_cmd_table, sizeof(struct ahci_cmd_table));
@@ -3160,7 +3161,7 @@ err:
struct ata_log_page_10h *log;
int err_slot;
- log = (struct ata_log_page_10h *)ap->ap_err_scratch;
+ log = (struct ata_log_page_10h *)ap_err_scratch;
if (ISSET(log->err_regs.type, ATA_LOG_10H_TYPE_NOTQUEUED)) {
/* Not queued bit was set - wasn't an NCQ error? */
printf("%s: read NCQ error page, but not an NCQ "
@@ -3181,6 +3182,9 @@ err:
/* Restore saved CMD register state */
ahci_pwrite(ap, AHCI_PREG_CMD, cmd);
+
+ if (ap_err_scratch)
+ dma_free(ap_err_scratch, DEV_BSIZE);
return (rc);
}