1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-19 10:53:58 +00:00

- When creating the DMA tag for user data, don't ask for more segments

than required for handling MAXPHYS and report the resulting maximum
  I/O size to CAM instead of implicitly limiting it to DFLTPHYS.
- Move the variables of sym_action2() out of nested scope as required
  by style(9) and remove extraneous curly braces.
- Replace a magic value for PCIR_COMMAND with the appropriate macro.
- Use DEVMETHOD_END.
- Use NULL instead of 0 for pointers.

Tested with a HBA donated by wilko.

MFC after:	3 days
This commit is contained in:
Marius Strobl 2012-05-26 08:03:42 +00:00
parent 2dbc3019d0
commit 21b5913f1f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=236061
2 changed files with 29 additions and 39 deletions

View File

@ -82,6 +82,13 @@
*/ */
#define SYM_CONF_MAX_TAG_ORDER (6) #define SYM_CONF_MAX_TAG_ORDER (6)
/*
* DMA boundary
* We need to ensure 16 MB boundaries not to be crossed during DMA of
* each segment, due to some chips being flawed.
*/
#define SYM_CONF_DMA_BOUNDARY (1UL << 24)
/* /*
* Max number of scatter/gather entries for en IO. * Max number of scatter/gather entries for en IO.
* Each entry costs 8 bytes in the internal CCB data structure. * Each entry costs 8 bytes in the internal CCB data structure.

View File

@ -1623,6 +1623,7 @@ struct sym_hcb {
u_int features; /* Chip features map */ u_int features; /* Chip features map */
u_char myaddr; /* SCSI id of the adapter */ u_char myaddr; /* SCSI id of the adapter */
u_char maxburst; /* log base 2 of dwords burst */ u_char maxburst; /* log base 2 of dwords burst */
u_char maxsegcnt; /* Max DMA S/G segments */
u_char maxwide; /* Maximum transfer width */ u_char maxwide; /* Maximum transfer width */
u_char minsync; /* Min sync period factor (ST) */ u_char minsync; /* Min sync period factor (ST) */
u_char maxsync; /* Max sync period factor (ST) */ u_char maxsync; /* Max sync period factor (ST) */
@ -7988,10 +7989,7 @@ sym_fast_scatter_sg_physical(hcb_p np, ccb_p cp,
/* /*
* Scatter a SG list with physical addresses into bus addressable chunks. * Scatter a SG list with physical addresses into bus addressable chunks.
* We need to ensure 16MB boundaries not to be crossed during DMA of
* each segment, due to some chips being flawed.
*/ */
#define BOUND_MASK ((1UL<<24)-1)
static int static int
sym_scatter_sg_physical(hcb_p np, ccb_p cp, bus_dma_segment_t *psegs, int nsegs) sym_scatter_sg_physical(hcb_p np, ccb_p cp, bus_dma_segment_t *psegs, int nsegs)
{ {
@ -8007,7 +8005,7 @@ sym_scatter_sg_physical(hcb_p np, ccb_p cp, bus_dma_segment_t *psegs, int nsegs)
pe = ps + psegs[t].ds_len; pe = ps + psegs[t].ds_len;
while (s >= 0) { while (s >= 0) {
pn = (pe - 1) & ~BOUND_MASK; pn = (pe - 1) & ~(SYM_CONF_DMA_BOUNDARY - 1);
if (pn <= ps) if (pn <= ps)
pn = ps; pn = ps;
k = pe - pn; k = pe - pn;
@ -8032,17 +8030,21 @@ sym_scatter_sg_physical(hcb_p np, ccb_p cp, bus_dma_segment_t *psegs, int nsegs)
return t >= 0 ? -1 : 0; return t >= 0 ? -1 : 0;
} }
#undef BOUND_MASK
/* /*
* SIM action for non performance critical stuff. * SIM action for non performance critical stuff.
*/ */
static void sym_action2(struct cam_sim *sim, union ccb *ccb) static void sym_action2(struct cam_sim *sim, union ccb *ccb)
{ {
union ccb *abort_ccb;
struct ccb_hdr *ccb_h;
struct ccb_pathinq *cpi;
struct ccb_trans_settings *cts;
struct sym_trans *tip;
hcb_p np; hcb_p np;
tcb_p tp; tcb_p tp;
lcb_p lp; lcb_p lp;
struct ccb_hdr *ccb_h; u_char dflags;
/* /*
* Retrieve our controller data structure. * Retrieve our controller data structure.
@ -8055,9 +8057,6 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb)
switch (ccb_h->func_code) { switch (ccb_h->func_code) {
case XPT_SET_TRAN_SETTINGS: case XPT_SET_TRAN_SETTINGS:
{
struct ccb_trans_settings *cts;
cts = &ccb->cts; cts = &ccb->cts;
tp = &np->target[ccb_h->target_id]; tp = &np->target[ccb_h->target_id];
@ -8079,13 +8078,7 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb)
sym_xpt_done2(np, ccb, CAM_REQ_CMP); sym_xpt_done2(np, ccb, CAM_REQ_CMP);
break; break;
}
case XPT_GET_TRAN_SETTINGS: case XPT_GET_TRAN_SETTINGS:
{
struct ccb_trans_settings *cts;
struct sym_trans *tip;
u_char dflags;
cts = &ccb->cts; cts = &ccb->cts;
tp = &np->target[ccb_h->target_id]; tp = &np->target[ccb_h->target_id];
lp = sym_lp(np, tp, ccb_h->target_lun); lp = sym_lp(np, tp, ccb_h->target_lun);
@ -8129,16 +8122,12 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb)
#undef cts__scsi #undef cts__scsi
sym_xpt_done2(np, ccb, CAM_REQ_CMP); sym_xpt_done2(np, ccb, CAM_REQ_CMP);
break; break;
}
case XPT_CALC_GEOMETRY: case XPT_CALC_GEOMETRY:
{
cam_calc_geometry(&ccb->ccg, /*extended*/1); cam_calc_geometry(&ccb->ccg, /*extended*/1);
sym_xpt_done2(np, ccb, CAM_REQ_CMP); sym_xpt_done2(np, ccb, CAM_REQ_CMP);
break; break;
}
case XPT_PATH_INQ: case XPT_PATH_INQ:
{ cpi = &ccb->cpi;
struct ccb_pathinq *cpi = &ccb->cpi;
cpi->version_num = 1; cpi->version_num = 1;
cpi->hba_inquiry = PI_MDP_ABLE|PI_SDTR_ABLE|PI_TAG_ABLE; cpi->hba_inquiry = PI_MDP_ABLE|PI_SDTR_ABLE|PI_TAG_ABLE;
if ((np->features & FE_WIDE) != 0) if ((np->features & FE_WIDE) != 0)
@ -8173,12 +8162,11 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb)
cpi->xport_specific.spi.ppr_options = cpi->xport_specific.spi.ppr_options =
SID_SPI_CLOCK_DT_ST; SID_SPI_CLOCK_DT_ST;
} }
cpi->maxio = np->maxsegcnt * SYM_CONF_DMA_BOUNDARY;
sym_xpt_done2(np, ccb, CAM_REQ_CMP); sym_xpt_done2(np, ccb, CAM_REQ_CMP);
break; break;
}
case XPT_ABORT: case XPT_ABORT:
{ abort_ccb = ccb->cab.abort_ccb;
union ccb *abort_ccb = ccb->cab.abort_ccb;
switch(abort_ccb->ccb_h.func_code) { switch(abort_ccb->ccb_h.func_code) {
case XPT_SCSI_IO: case XPT_SCSI_IO:
if (sym_abort_scsiio(np, abort_ccb, 0) == 0) { if (sym_abort_scsiio(np, abort_ccb, 0) == 0) {
@ -8190,14 +8178,10 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb)
break; break;
} }
break; break;
}
case XPT_RESET_DEV: case XPT_RESET_DEV:
{
sym_reset_dev(np, ccb); sym_reset_dev(np, ccb);
break; break;
}
case XPT_RESET_BUS: case XPT_RESET_BUS:
{
sym_reset_scsi_bus(np, 0); sym_reset_scsi_bus(np, 0);
if (sym_verbose) { if (sym_verbose) {
xpt_print_path(np->path); xpt_print_path(np->path);
@ -8206,7 +8190,6 @@ static void sym_action2(struct cam_sim *sim, union ccb *ccb)
sym_init (np, 1); sym_init (np, 1);
sym_xpt_done2(np, ccb, CAM_REQ_CMP); sym_xpt_done2(np, ccb, CAM_REQ_CMP);
break; break;
}
case XPT_ACCEPT_TARGET_IO: case XPT_ACCEPT_TARGET_IO:
case XPT_CONT_TARGET_IO: case XPT_CONT_TARGET_IO:
case XPT_EN_LUN: case XPT_EN_LUN:
@ -8362,7 +8345,7 @@ sym_update_dflags(hcb_p np, u_char *flags, struct ccb_trans_settings *cts)
static device_method_t sym_pci_methods[] = { static device_method_t sym_pci_methods[] = {
DEVMETHOD(device_probe, sym_pci_probe), DEVMETHOD(device_probe, sym_pci_probe),
DEVMETHOD(device_attach, sym_pci_attach), DEVMETHOD(device_attach, sym_pci_attach),
{ 0, 0 } DEVMETHOD_END
}; };
static driver_t sym_pci_driver = { static driver_t sym_pci_driver = {
@ -8373,7 +8356,7 @@ static driver_t sym_pci_driver = {
static devclass_t sym_devclass; static devclass_t sym_devclass;
DRIVER_MODULE(sym, pci, sym_pci_driver, sym_devclass, 0, 0); DRIVER_MODULE(sym, pci, sym_pci_driver, sym_devclass, NULL, NULL);
MODULE_DEPEND(sym, cam, 1, 1, 1); MODULE_DEPEND(sym, cam, 1, 1, 1);
MODULE_DEPEND(sym, pci, 1, 1, 1); MODULE_DEPEND(sym, pci, 1, 1, 1);
@ -8586,15 +8569,16 @@ sym_pci_attach(device_t dev)
/* /*
* Allocate a tag for the DMA of user data. * Allocate a tag for the DMA of user data.
*/ */
if (bus_dma_tag_create(np->bus_dmat, 1, (1<<24), np->maxsegcnt = MIN(SYM_CONF_MAX_SG,
BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, (MAXPHYS / SYM_CONF_DMA_BOUNDARY) + 1);
NULL, NULL, if (bus_dma_tag_create(np->bus_dmat, 1, SYM_CONF_DMA_BOUNDARY,
BUS_SPACE_MAXSIZE, SYM_CONF_MAX_SG, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
(1<<24), 0, busdma_lock_mutex, &np->mtx, BUS_SPACE_MAXSIZE, np->maxsegcnt, SYM_CONF_DMA_BOUNDARY,
&np->data_dmat)) { BUS_DMA_ALLOCNOW, busdma_lock_mutex, &np->mtx, &np->data_dmat)) {
device_printf(dev, "failed to create DMA tag.\n"); device_printf(dev, "failed to create DMA tag.\n");
goto attach_failed; goto attach_failed;
} }
/* /*
* Read and apply some fix-ups to the PCI COMMAND * Read and apply some fix-ups to the PCI COMMAND
* register. We want the chip to be enabled for: * register. We want the chip to be enabled for:
@ -8603,9 +8587,8 @@ sym_pci_attach(device_t dev)
* - Write And Invalidate. * - Write And Invalidate.
*/ */
command = pci_read_config(dev, PCIR_COMMAND, 2); command = pci_read_config(dev, PCIR_COMMAND, 2);
command |= PCIM_CMD_BUSMASTEREN; command |= PCIM_CMD_BUSMASTEREN | PCIM_CMD_PERRESPEN |
command |= PCIM_CMD_PERRESPEN; PCIM_CMD_MWRICEN;
command |= /* PCIM_CMD_MWIEN */ 0x0010;
pci_write_config(dev, PCIR_COMMAND, command, 2); pci_write_config(dev, PCIR_COMMAND, command, 2);
/* /*