svn commit: r269617 - head/sys/dev/hptmv
John Baldwin
jhb at FreeBSD.org
Tue Aug 5 23:58:50 UTC 2014
Author: jhb
Date: Tue Aug 5 23:58:49 2014
New Revision: 269617
URL: http://svnweb.freebsd.org/changeset/base/269617
Log:
Various fixes to hptmv(4):
- Replace the global driver lock with a per-instance device lock.
- Use the per-instance device lock instead of Giant for the CAM sim lock.
- Add global locks to protect the adapter list and DPC queues.
- Use wakeup() and mtx_sleep() to wait for certain events like the
controller going idle rather than polling via timeouts passed to
tsleep().
- Use callout(9) instead of timeout(9).
- Mark the interrupt handler MPSAFE.
- Remove compat shims for FreeBSD versions older than 8.0.
Reviewed by: Steve Chang <ychang at highpoint-tech.com>
Modified:
head/sys/dev/hptmv/entry.c
head/sys/dev/hptmv/global.h
head/sys/dev/hptmv/hptproc.c
head/sys/dev/hptmv/ioctl.c
head/sys/dev/hptmv/mv.c
head/sys/dev/hptmv/osbsd.h
Modified: head/sys/dev/hptmv/entry.c
==============================================================================
--- head/sys/dev/hptmv/entry.c Tue Aug 5 23:55:23 2014 (r269616)
+++ head/sys/dev/hptmv/entry.c Tue Aug 5 23:58:49 2014 (r269617)
@@ -40,20 +40,12 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/kthread.h>
-#if (__FreeBSD_version >= 500000)
#include <sys/mutex.h>
#include <sys/module.h>
-#endif
+#include <sys/sx.h>
-#if (__FreeBSD_version >= 500000)
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
-#else
-#include <pci/pcireg.h>
-#include <pci/pcivar.h>
-#include <sys/wait.h>
-#include <sys/sysproto.h>
-#endif
#ifndef __KERNEL__
#define __KERNEL__
@@ -119,6 +111,7 @@ static void HPTLIBAPI fOsCommandDone(_VB
static void ccb_done(union ccb *ccb);
static void hpt_queue_ccb(union ccb **ccb_Q, union ccb *ccb);
static void hpt_free_ccb(union ccb **ccb_Q, union ccb *ccb);
+static void hpt_intr_locked(IAL_ADAPTER_T *pAdapter);
static void hptmv_free_edma_queues(IAL_ADAPTER_T *pAdapter);
static void hptmv_free_channel(IAL_ADAPTER_T *pAdapter, MV_U8 channelNum);
static void handleEdmaError(_VBUS_ARG PCommand pCmd);
@@ -143,6 +136,8 @@ static MV_BOOLEAN hptmv_event_notify(MV_
#define ccb_ccb_ptr spriv_ptr0
#define ccb_adapter ccb_h.spriv_ptr1
+static struct sx hptmv_list_lock;
+SX_SYSINIT(hptmv_list_lock, &hptmv_list_lock, "hptmv list");
IAL_ADAPTER_T *gIal_Adapter = 0;
IAL_ADAPTER_T *pCurAdapter = 0;
static MV_SATA_CHANNEL gMvSataChannels[MAX_VBUS][MV_SATA_CHANNELS_NUM];
@@ -159,48 +154,11 @@ UCHAR DPC_Request_Nums = 0;
static ST_HPT_DPC DpcQueue[MAX_DPC];
static int DpcQueue_First=0;
static int DpcQueue_Last = 0;
+static struct mtx DpcQueue_Lock;
+MTX_SYSINIT(hpmtv_dpc_lock, &DpcQueue_Lock, "hptmv dpc", MTX_DEF);
char DRIVER_VERSION[] = "v1.16";
-#if (__FreeBSD_version >= 500000)
-static struct mtx driver_lock;
-intrmask_t lock_driver()
-{
-
- intrmask_t spl = 0;
- mtx_lock(&driver_lock);
- return spl;
-}
-void unlock_driver(intrmask_t spl)
-{
- mtx_unlock(&driver_lock);
-}
-#else
-static int driver_locked = 0;
-intrmask_t lock_driver()
-{
- intrmask_t spl = splcam();
-loop:
- while (driver_locked)
- tsleep(&driver_locked, PRIBIO, "hptlck", hz);
- atomic_add_int(&driver_locked, 1);
- if (driver_locked>1) {
- atomic_subtract_int(&driver_locked, 1);
- goto loop;
- }
- return spl;
-}
-
-void unlock_driver(intrmask_t spl)
-{
- atomic_subtract_int(&driver_locked, 1);
- if (driver_locked==0) {
- wakeup(&driver_locked);
- }
- splx(spl);
-}
-#endif
-
/*******************************************************************************
* Name: hptmv_free_channel
*
@@ -790,7 +748,8 @@ hptmv_handle_event(void * data, int flag
IAL_ADAPTER_T *pAdapter = (IAL_ADAPTER_T *)data;
MV_SATA_ADAPTER *pMvSataAdapter = &pAdapter->mvSataAdapter;
MV_U8 channelIndex;
-
+
+ mtx_assert(&pAdapter->lock, MA_OWNED);
/* mvOsSemTake(&pMvSataAdapter->semaphore); */
for (channelIndex = 0; channelIndex < MV_SATA_CHANNELS_NUM; channelIndex++)
{
@@ -898,7 +857,7 @@ hptmv_event_notify(MV_SATA_ADAPTER *pMvS
KdPrint(("RR18xx [%d,%d]: device connected event received\n",
pMvSataAdapter->adapterId, channel));
/* Delete previous timers (if multiple drives connected in the same time */
- pAdapter->event_timer_connect = timeout(hptmv_handle_event_connect, pAdapter, 10*hz);
+ callout_reset(&pAdapter->event_timer_connect, 10 * hz, hptmv_handle_event_connect, pAdapter);
}
else if (param1 == EVENT_DISCONNECT)
{
@@ -907,7 +866,7 @@ hptmv_event_notify(MV_SATA_ADAPTER *pMvS
pMvSataAdapter->adapterId, channel));
device_change(pAdapter, channel, FALSE);
/* Delete previous timers (if multiple drives disconnected in the same time */
- /*pAdapter->event_timer_disconnect = timeout(hptmv_handle_event_disconnect, pAdapter, 10*hz); */
+ /*callout_reset(&pAdapter->event_timer_disconnect, 10 * hz, hptmv_handle_event_disconnect, pAdapter); */
/*It is not necessary to wait, handle it directly*/
hptmv_handle_event_disconnect(pAdapter);
}
@@ -1286,18 +1245,6 @@ dmamap_put(PBUS_DMAMAP p)
p->pAdapter->pbus_dmamap_list = p;
}
-/*Since mtx not provide the initialize when declare, so we Final init here to initialize the global mtx*/
-#if __FreeBSD_version >= 500000
-#define override_kernel_driver()
-
-static void hpt_init(void *dummy)
-{
- override_kernel_driver();
- mtx_init(&driver_lock, "hptsleeplock", NULL, MTX_DEF);
-}
-SYSINIT(hptinit, SI_SUB_CONFIGURE, SI_ORDER_FIRST, hpt_init, NULL);
-#endif
-
static int num_adapters = 0;
static int
init_adapter(IAL_ADAPTER_T *pAdapter)
@@ -1308,8 +1255,11 @@ init_adapter(IAL_ADAPTER_T *pAdapter)
PVDevice pVDev;
- intrmask_t oldspl = lock_driver();
+ mtx_init(&pAdapter->lock, "hptsleeplock", NULL, MTX_DEF);
+ callout_init_mtx(&pAdapter->event_timer_connect, &pAdapter->lock, 0);
+ callout_init_mtx(&pAdapter->event_timer_disconnect, &pAdapter->lock, 0);
+ sx_xlock(&hptmv_list_lock);
pAdapter->next = 0;
if(gIal_Adapter == 0){
@@ -1320,6 +1270,7 @@ init_adapter(IAL_ADAPTER_T *pAdapter)
pCurAdapter->next = pAdapter;
pCurAdapter = pAdapter;
}
+ sx_xunlock(&hptmv_list_lock);
pAdapter->outstandingCommands = 0;
@@ -1337,10 +1288,8 @@ init_adapter(IAL_ADAPTER_T *pAdapter)
MAX_SG_DESCRIPTORS, /* nsegments */
0x10000, /* maxsegsize */
BUS_DMA_WAITOK, /* flags */
-#if __FreeBSD_version>502000
busdma_lock_mutex, /* lockfunc */
- &driver_lock, /* lockfuncarg */
-#endif
+ &pAdapter->lock, /* lockfuncarg */
&pAdapter->io_dma_parent /* tag */))
{
return ENXIO;
@@ -1350,7 +1299,6 @@ init_adapter(IAL_ADAPTER_T *pAdapter)
if (hptmv_allocate_edma_queues(pAdapter))
{
MV_ERROR("RR18xx: Failed to allocate memory for EDMA queues\n");
- unlock_driver(oldspl);
return ENOMEM;
}
@@ -1363,7 +1311,6 @@ init_adapter(IAL_ADAPTER_T *pAdapter)
{
MV_ERROR("RR18xx: Failed to remap memory space\n");
hptmv_free_edma_queues(pAdapter);
- unlock_driver(oldspl);
return ENXIO;
}
else
@@ -1393,7 +1340,6 @@ init_adapter(IAL_ADAPTER_T *pAdapter)
unregister:
bus_release_resource(pAdapter->hpt_dev, SYS_RES_MEMORY, rid, pAdapter->mem_res);
hptmv_free_edma_queues(pAdapter);
- unlock_driver(oldspl);
return ENXIO;
}
pAdapter->ver_601 = pMvSataAdapter->pcbVersion;
@@ -1438,7 +1384,7 @@ unregister:
free(pAdapter->pbus_dmamap, M_DEVBUF);
goto unregister;
}
- callout_handle_init(&pmap->timeout_ch);
+ callout_init_mtx(&pmap->timeout, &pAdapter->lock, 0);
}
/* setup PRD Tables */
KdPrint(("Allocate PRD Tables\n"));
@@ -1537,7 +1483,6 @@ unregister:
#endif
mvSataUnmaskAdapterInterrupt(pMvSataAdapter);
- unlock_driver(oldspl);
return 0;
}
@@ -2036,20 +1981,7 @@ hpt_attach(device_t dev)
struct cam_devq *devq;
struct cam_sim *hpt_vsim;
- printf("%s Version %s \n", DRIVER_NAME, DRIVER_VERSION);
-
- if (!pAdapter)
- {
- pAdapter = (IAL_ADAPTER_T *)malloc(sizeof (IAL_ADAPTER_T), M_DEVBUF, M_NOWAIT);
-#if __FreeBSD_version > 410000
- device_set_softc(dev, (void *)pAdapter);
-#else
- device_set_driver(dev, (driver_t *)pAdapter);
-#endif
- }
-
- if (!pAdapter) return (ENOMEM);
- bzero(pAdapter, sizeof(IAL_ADAPTER_T));
+ device_printf(dev, "%s Version %s \n", DRIVER_NAME, DRIVER_VERSION);
pAdapter->hpt_dev = dev;
@@ -2064,13 +1996,9 @@ hpt_attach(device_t dev)
return(ENXIO);
}
-#if __FreeBSD_version <700000
- if (bus_setup_intr(pAdapter->hpt_dev, pAdapter->hpt_irq, INTR_TYPE_CAM,
- hpt_intr, pAdapter, &pAdapter->hpt_intr))
-#else
- if (bus_setup_intr(pAdapter->hpt_dev, pAdapter->hpt_irq, INTR_TYPE_CAM,
+ if (bus_setup_intr(pAdapter->hpt_dev, pAdapter->hpt_irq,
+ INTR_TYPE_CAM | INTR_MPSAFE,
NULL, hpt_intr, pAdapter, &pAdapter->hpt_intr))
-#endif
{
hpt_printk(("can't set up interrupt\n"));
free(pAdapter, M_DEVBUF);
@@ -2100,25 +2028,19 @@ hpt_attach(device_t dev)
/*
* Construct our SIM entry
*/
-#if __FreeBSD_version <700000
- hpt_vsim = cam_sim_alloc(hpt_action, hpt_poll, __str(PROC_DIR_NAME),
- pAdapter, device_get_unit(pAdapter->hpt_dev), 1, 8, devq);
-#else
hpt_vsim = cam_sim_alloc(hpt_action, hpt_poll, __str(PROC_DIR_NAME),
- pAdapter, device_get_unit(pAdapter->hpt_dev), &Giant, 1, 8, devq);
-#endif
+ pAdapter, device_get_unit(pAdapter->hpt_dev),
+ &pAdapter->lock, 1, 8, devq);
if (hpt_vsim == NULL) {
cam_simq_free(devq);
return ENOMEM;
}
-#if __FreeBSD_version <700000
- if (xpt_bus_register(hpt_vsim, 0) != CAM_SUCCESS)
-#else
+ mtx_lock(&pAdapter->lock);
if (xpt_bus_register(hpt_vsim, dev, 0) != CAM_SUCCESS)
-#endif
{
cam_sim_free(hpt_vsim, /*free devq*/ TRUE);
+ mtx_unlock(&pAdapter->lock);
hpt_vsim = NULL;
return ENXIO;
}
@@ -2129,9 +2051,11 @@ hpt_attach(device_t dev)
{
xpt_bus_deregister(cam_sim_path(hpt_vsim));
cam_sim_free(hpt_vsim, /*free_devq*/TRUE);
+ mtx_unlock(&pAdapter->lock);
hpt_vsim = NULL;
return ENXIO;
}
+ mtx_unlock(&pAdapter->lock);
xpt_setup_ccb(&(ccb->ccb_h), pAdapter->path, /*priority*/5);
ccb->ccb_h.func_code = XPT_SASYNC_CB;
@@ -2164,7 +2088,11 @@ hpt_detach(device_t dev)
static void
hpt_poll(struct cam_sim *sim)
{
- hpt_intr((void *)cam_sim_softc(sim));
+ IAL_ADAPTER_T *pAdapter;
+
+ pAdapter = cam_sim_softc(sim);
+
+ hpt_intr_locked((void *)cam_sim_softc(sim));
}
/****************************************************************
@@ -2174,9 +2102,19 @@ hpt_poll(struct cam_sim *sim)
static void
hpt_intr(void *arg)
{
- IAL_ADAPTER_T *pAdapter = (IAL_ADAPTER_T *)arg;
- intrmask_t oldspl = lock_driver();
-
+ IAL_ADAPTER_T *pAdapter;
+
+ pAdapter = arg;
+ mtx_lock(&pAdapter->lock);
+ hpt_intr_locked(pAdapter);
+ mtx_unlock(&pAdapter->lock);
+}
+
+static void
+hpt_intr_locked(IAL_ADAPTER_T *pAdapter)
+{
+
+ mtx_assert(&pAdapter->lock, MA_OWNED);
/* KdPrintI(("----- Entering Isr() -----\n")); */
if (mvSataInterruptServiceRoutine(&pAdapter->mvSataAdapter) == MV_TRUE)
{
@@ -2185,7 +2123,6 @@ hpt_intr(void *arg)
}
/* KdPrintI(("----- Leaving Isr() -----\n")); */
- unlock_driver(oldspl);
}
/**********************************************************
@@ -2228,11 +2165,11 @@ hpt_shutdown(device_t dev)
IAL_ADAPTER_T *pAdapter;
pAdapter = device_get_softc(dev);
- if (pAdapter == NULL)
- return (EINVAL);
EVENTHANDLER_DEREGISTER(shutdown_final, pAdapter->eh);
+ mtx_lock(&pAdapter->lock);
FlushAdapter(pAdapter);
+ mtx_unlock(&pAdapter->lock);
/* give the flush some time to happen,
*otherwise "shutdown -p now" will make file system corrupted */
DELAY(1000 * 1000 * 5);
@@ -2288,6 +2225,7 @@ ccb_done(union ccb *ccb)
{
if(DPC_Request_Nums == 0)
Check_Idle_Call(pAdapter);
+ wakeup(pAdapter);
}
}
@@ -2301,11 +2239,11 @@ ccb_done(union ccb *ccb)
void
hpt_action(struct cam_sim *sim, union ccb *ccb)
{
- intrmask_t oldspl;
IAL_ADAPTER_T * pAdapter = (IAL_ADAPTER_T *) cam_sim_softc(sim);
PBUS_DMAMAP pmap;
_VBUS_INST(&pAdapter->VBus)
+ mtx_assert(&pAdapter->lock, MA_OWNED);
CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("hpt_action\n"));
KdPrint(("hpt_action(%lx,%lx{%x})\n", (u_long)sim, (u_long)ccb, ccb->ccb_h.func_code));
@@ -2327,7 +2265,6 @@ hpt_action(struct cam_sim *sim, union cc
return;
}
- oldspl = lock_driver();
if (pAdapter->outstandingCommands==0 && DPC_Request_Nums==0)
Check_Idle_Call(pAdapter);
@@ -2340,7 +2277,6 @@ hpt_action(struct cam_sim *sim, union cc
hpt_queue_ccb(&pAdapter->pending_Q, ccb);
else
OsSendCommand(_VBUS_P ccb);
- unlock_driver(oldspl);
/* KdPrint(("leave scsiio\n")); */
break;
@@ -2348,9 +2284,7 @@ hpt_action(struct cam_sim *sim, union cc
case XPT_RESET_BUS:
KdPrint(("reset bus\n"));
- oldspl = lock_driver();
fResetVBus(_VBUS_P0);
- unlock_driver(oldspl);
xpt_done(ccb);
break;
@@ -2374,29 +2308,7 @@ hpt_action(struct cam_sim *sim, union cc
break;
case XPT_CALC_GEOMETRY:
-#if __FreeBSD_version >= 500000
cam_calc_geometry(&ccb->ccg, 1);
-#else
- {
- struct ccb_calc_geometry *ccg;
- u_int32_t size_mb;
- u_int32_t secs_per_cylinder;
-
- ccg = &ccb->ccg;
- size_mb = ccg->volume_size / ((1024L * 1024L) / ccg->block_size);
-
- if (size_mb > 1024 ) {
- ccg->heads = 255;
- ccg->secs_per_track = 63;
- } else {
- ccg->heads = 64;
- ccg->secs_per_track = 32;
- }
- secs_per_cylinder = ccg->heads * ccg->secs_per_track;
- ccg->cylinders = ccg->volume_size / secs_per_cylinder;
- ccb->ccb_h.status = CAM_REQ_CMP;
- }
-#endif
xpt_done(ccb);
break;
@@ -2482,20 +2394,20 @@ hpt_free_ccb(union ccb **ccb_Q, union cc
***************************************************************************/
static void hpt_worker_thread(void)
{
- intrmask_t oldspl;
for(;;) {
+ mtx_lock(&DpcQueue_Lock);
while (DpcQueue_First!=DpcQueue_Last) {
ST_HPT_DPC p;
- oldspl = lock_driver();
p = DpcQueue[DpcQueue_First];
DpcQueue_First++;
DpcQueue_First %= MAX_DPC;
DPC_Request_Nums++;
- unlock_driver(oldspl);
+ mtx_unlock(&DpcQueue_Lock);
p.dpc(p.pAdapter, p.arg, p.flags);
- oldspl = lock_driver();
+ mtx_lock(&p.pAdapter->lock);
+ mtx_lock(&DpcQueue_Lock);
DPC_Request_Nums--;
/* since we may have prevented Check_Idle_Call, do it here */
if (DPC_Request_Nums==0) {
@@ -2505,28 +2417,22 @@ static void hpt_worker_thread(void)
CheckPendingCall(_VBUS_P0);
}
}
- unlock_driver(oldspl);
+ mtx_unlock(&p.pAdapter->lock);
+ mtx_unlock(&DpcQueue_Lock);
/*Schedule out*/
-#if (__FreeBSD_version < 500000)
- YIELD_THREAD;
-#else
-#if (__FreeBSD_version > 700033)
- pause("sched", 1);
-#else
- tsleep((caddr_t)hpt_worker_thread, PPAUSE, "sched", 1);
-#endif
-#endif
if (SIGISMEMBER(curproc->p_siglist, SIGSTOP)) {
/* abort rebuilding process. */
IAL_ADAPTER_T *pAdapter;
PVDevice pArray;
PVBus _vbus_p;
int i;
+
+ sx_slock(&hptmv_list_lock);
pAdapter = gIal_Adapter;
while(pAdapter != 0){
-
+ mtx_lock(&pAdapter->lock);
_vbus_p = &pAdapter->VBus;
for (i=0;i<MAX_ARRAY_PER_VBUS;i++)
@@ -2540,34 +2446,24 @@ static void hpt_worker_thread(void)
pArray->u.array.rf_abort_rebuild = 1;
}
}
+ mtx_unlock(&pAdapter->lock);
pAdapter = pAdapter->next;
}
+ sx_sunlock(&hptmv_list_lock);
}
+ mtx_lock(&DpcQueue_Lock);
}
+ mtx_unlock(&DpcQueue_Lock);
/*Remove this debug option*/
/*
#ifdef DEBUG
if (SIGISMEMBER(curproc->p_siglist, SIGSTOP))
-#if (__FreeBSD_version > 700033)
pause("hptrdy", 2*hz);
-#else
- tsleep((caddr_t)hpt_worker_thread, PPAUSE, "hptrdy", 2*hz);
-#endif
#endif
*/
- #if (__FreeBSD_version >= 800002)
kproc_suspend_check(curproc);
- #elif (__FreeBSD_version >= 500043)
- kthread_suspend_check(curproc);
- #else
- kproc_suspend_loop(curproc);
- #endif
-#if (__FreeBSD_version > 700033)
- pause("hptrdy", 2*hz); /* wait for something to do */
-#else
- tsleep((caddr_t)hpt_worker_thread, PPAUSE, "hptrdy", 2*hz); /* wait for something to do */
-#endif
+ pause("-", 2*hz); /* wait for something to do */
}
}
@@ -2586,6 +2482,7 @@ launch_worker_thread(void)
kproc_start(&hpt_kp);
+ sx_slock(&hptmv_list_lock);
for (pAdapTemp = gIal_Adapter; pAdapTemp; pAdapTemp = pAdapTemp->next) {
_VBUS_INST(&pAdapTemp->VBus)
@@ -2601,17 +2498,13 @@ launch_worker_thread(void)
(UCHAR)((pVDev->u.array.CriticalMembers || pVDev->VDeviceType == VD_RAID_1)? DUPLICATE : REBUILD_PARITY));
}
}
+ sx_sunlock(&hptmv_list_lock);
/*
* hpt_worker_thread needs to be suspended after shutdown sync, when fs sync finished.
*/
-#if (__FreeBSD_version < 500043)
- EVENTHANDLER_REGISTER(shutdown_post_sync, shutdown_kproc, hptdaemonproc,
- SHUTDOWN_PRI_LAST);
-#else
EVENTHANDLER_REGISTER(shutdown_post_sync, kproc_shutdown, hptdaemonproc,
SHUTDOWN_PRI_LAST);
-#endif
}
/*
*SYSINIT(hptwt, SI_SUB_KTHREAD_IDLE, SI_ORDER_FIRST, launch_worker_thread, NULL);
@@ -2721,10 +2614,12 @@ SetInquiryData(PINQUIRYDATA inquiryData,
static void
hpt_timeout(void *arg)
{
- _VBUS_INST(&((PBUS_DMAMAP)((union ccb *)arg)->ccb_adapter)->pAdapter->VBus)
- intrmask_t oldspl = lock_driver();
+ PBUS_DMAMAP pmap = (PBUS_DMAMAP)((union ccb *)arg)->ccb_adapter;
+ IAL_ADAPTER_T *pAdapter = pmap->pAdapter;
+ _VBUS_INST(&pAdapter->VBus)
+
+ mtx_assert(&pAdapter->lock, MA_OWNED);
fResetVBus(_VBUS_P0);
- unlock_driver(oldspl);
}
static void
@@ -2766,7 +2661,7 @@ hpt_io_dmamap_callback(void *arg, bus_dm
}
}
- pmap->timeout_ch = timeout(hpt_timeout, (caddr_t)ccb, 20*hz);
+ callout_reset(&pmap->timeout, 20 * hz, hpt_timeout, ccb);
pVDev->pfnSendCommand(_VBUS_P pCmd);
CheckPendingCall(_VBUS_P0);
}
@@ -2964,6 +2859,8 @@ OsSendCommand(_VBUS_ARG union ccb *ccb)
ccb->ccb_h.status = CAM_REQ_CMP_ERR;
dmamap_put(pmap);
pAdapter->outstandingCommands--;
+ if (pAdapter->outstandingCommands == 0)
+ wakeup(pAdapter);
xpt_done(ccb);
}
goto Command_Complished;
@@ -2987,8 +2884,8 @@ fOsCommandDone(_VBUS_ARG PCommand pCmd)
IAL_ADAPTER_T *pAdapter = pmap->pAdapter;
KdPrint(("fOsCommandDone(pcmd=%p, result=%d)\n", pCmd, pCmd->Result));
-
- untimeout(hpt_timeout, (caddr_t)ccb, pmap->timeout_ch);
+
+ callout_stop(&pmap->timeout);
switch(pCmd->Result) {
case RETURN_SUCCESS:
@@ -3032,9 +2929,11 @@ hpt_queue_dpc(HPT_DPC dpc, IAL_ADAPTER_T
{
int p;
+ mtx_lock(&DpcQueue_Lock);
p = (DpcQueue_Last + 1) % MAX_DPC;
if (p==DpcQueue_First) {
KdPrint(("DPC Queue full!\n"));
+ mtx_unlock(&DpcQueue_Lock);
return -1;
}
@@ -3043,6 +2942,7 @@ hpt_queue_dpc(HPT_DPC dpc, IAL_ADAPTER_T
DpcQueue[DpcQueue_Last].arg = arg;
DpcQueue[DpcQueue_Last].flags = flags;
DpcQueue_Last = p;
+ mtx_unlock(&DpcQueue_Lock);
return 0;
}
Modified: head/sys/dev/hptmv/global.h
==============================================================================
--- head/sys/dev/hptmv/global.h Tue Aug 5 23:55:23 2014 (r269616)
+++ head/sys/dev/hptmv/global.h Tue Aug 5 23:58:49 2014 (r269617)
@@ -132,11 +132,6 @@ typedef struct _VDevice_Ext
#define LongDiv(x, y) (x / (UINT)(y))
#define LongRem(x, y) (x % (UINT)(y))
#define LongMul(x, y) (x * y)
-/* Minimum and maximum macros */
-#if (__FreeBSD_version < 501000)
-#define MAX(a, b) (((a) > (b)) ? (a) : (b))
-#define MIN(a, b) (((a) < (b)) ? (a) : (b))
-#endif
/*************************************************************************
* C library
@@ -151,9 +146,6 @@ unsigned HPTLIBAPI os_strlen(const char
#define memcpy os_memcpy
#define memset os_memset
#define strlen os_strlen
-#elif (__FreeBSD_version <= 410000)
-#define memcpy(d, s, len) bcopy((s),(d),(len))
-#define memset(d, s, len) bzero((d),(len))
#endif
#define ZeroMemory(a, b) memset((char *)a, 0, b)
#define MemoryCopy(a,b,c) memcpy((char *)(a), (char *)(b), (UINT)(c))
Modified: head/sys/dev/hptmv/hptproc.c
==============================================================================
--- head/sys/dev/hptmv/hptproc.c Tue Aug 5 23:55:23 2014 (r269616)
+++ head/sys/dev/hptmv/hptproc.c Tue Aug 5 23:58:49 2014 (r269617)
@@ -65,8 +65,8 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter
PVDevice pSubArray, pVDev;
UINT i, iarray, ichan;
struct cam_periph *periph = NULL;
- intrmask_t oldspl;
+ mtx_lock(&pAdapter->lock);
#ifdef SUPPORT_ARRAY
if (length>=8 && strncmp(buffer, "rebuild ", 8)==0)
{
@@ -74,7 +74,6 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter
length-=8;
if (length>=5 && strncmp(buffer, "start", 5)==0)
{
- oldspl = lock_driver();
for(i = 0; i < MAX_ARRAY_PER_VBUS; i++)
if ((pArray=ArrayTables(i))->u.array.dArStamp==0)
continue;
@@ -83,12 +82,11 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter
hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray,
(UCHAR)((pArray->u.array.CriticalMembers || pArray->VDeviceType == VD_RAID_1)? DUPLICATE : REBUILD_PARITY));
}
- unlock_driver(oldspl);
+ mtx_unlock(&pAdapter->lock);
return orig_length;
}
else if (length>=4 && strncmp(buffer, "stop", 4)==0)
{
- oldspl = lock_driver();
for(i = 0; i < MAX_ARRAY_PER_VBUS; i++)
if ((pArray=ArrayTables(i))->u.array.dArStamp==0)
continue;
@@ -96,7 +94,7 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter
if (pArray->u.array.rf_rebuilding)
pArray->u.array.rf_abort_rebuild = 1;
}
- unlock_driver(oldspl);
+ mtx_unlock(&pAdapter->lock);
return orig_length;
}
else if (length>=3 && buffer[1]==','&& buffer[0]>='1'&& buffer[2]>='1')
@@ -107,17 +105,24 @@ hpt_set_asc_info(IAL_ADAPTER_T *pAdapter
if(iarray >= MAX_VDEVICE_PER_VBUS || ichan >= MV_SATA_CHANNELS_NUM) return -EINVAL;
pArray = _vbus_p->pVDevice[iarray];
- if (!pArray || (pArray->vf_online == 0)) return -EINVAL;
+ if (!pArray || (pArray->vf_online == 0)) {
+ mtx_unlock(&pAdapter->lock);
+ return -EINVAL;
+ }
for (i=0;i<MV_SATA_CHANNELS_NUM;i++)
if(i == ichan)
goto rebuild;
+ mtx_unlock(&pAdapter->lock);
return -EINVAL;
rebuild:
pVDev = &pAdapter->VDevices[ichan];
- if(!pVDev->u.disk.df_on_line || pVDev->pParent) return -EINVAL;
+ if(!pVDev->u.disk.df_on_line || pVDev->pParent) {
+ mtx_unlock(&pAdapter->lock);
+ return -EINVAL;
+ }
/* Not allow to use a mounted disk ??? test*/
for(i = 0; i < MAX_VDEVICE_PER_VBUS; i++)
@@ -127,6 +132,7 @@ rebuild:
if (periph != NULL && periph->refcount >= 1)
{
hpt_printk(("Can not use disk used by OS!\n"));
+ mtx_unlock(&pAdapter->lock);
return -EINVAL;
}
/* the Mounted Disk isn't delete */
@@ -139,15 +145,13 @@ rebuild:
{
pSubArray = pArray;
loop:
- oldspl = lock_driver();
if(hpt_add_disk_to_array(_VBUS_P VDEV_TO_ID(pSubArray), VDEV_TO_ID(pVDev)) == -1) {
- unlock_driver(oldspl);
+ mtx_unlock(&pAdapter->lock);
return -EINVAL;
}
pSubArray->u.array.rf_auto_rebuild = 0;
pSubArray->u.array.rf_abort_rebuild = 0;
hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pSubArray, DUPLICATE);
- unlock_driver(oldspl);
break;
}
case VD_RAID_0:
@@ -159,8 +163,10 @@ loop:
goto loop;
}
default:
+ mtx_unlock(&pAdapter->lock);
return -EINVAL;
}
+ mtx_unlock(&pAdapter->lock);
return orig_length;
}
}
@@ -175,24 +181,31 @@ loop:
if (length>=1 && *buffer>='1')
{
iarray = *buffer-'1';
- if(iarray >= MAX_VDEVICE_PER_VBUS) return -EINVAL;
+ if(iarray >= MAX_VDEVICE_PER_VBUS) {
+ mtx_unlock(&pAdapter->lock);
+ return -EINVAL;
+ }
pArray = _vbus_p->pVDevice[iarray];
- if (!pArray || (pArray->vf_online == 0)) return -EINVAL;
+ if (!pArray || (pArray->vf_online == 0)) {
+ mtx_unlock(&pAdapter->lock);
+ return -EINVAL;
+ }
- if(pArray->VDeviceType != VD_RAID_1 && pArray->VDeviceType != VD_RAID_5)
+ if(pArray->VDeviceType != VD_RAID_1 && pArray->VDeviceType != VD_RAID_5) {
+ mtx_unlock(&pAdapter->lock);
return -EINVAL;
+ }
if (!(pArray->u.array.rf_need_rebuild ||
pArray->u.array.rf_rebuilding ||
pArray->u.array.rf_verifying ||
pArray->u.array.rf_initializing))
{
- oldspl = lock_driver();
pArray->u.array.RebuildSectors = 0;
hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, pArray, VERIFY);
- unlock_driver(oldspl);
}
+ mtx_unlock(&pAdapter->lock);
return orig_length;
}
}
@@ -203,16 +216,21 @@ loop:
if (length>=1 && *buffer>='1')
{
iarray = *buffer-'1';
- if(iarray >= MAX_VDEVICE_PER_VBUS) return -EINVAL;
+ if(iarray >= MAX_VDEVICE_PER_VBUS) {
+ mtx_unlock(&pAdapter->lock);
+ return -EINVAL;
+ }
pArray = _vbus_p->pVDevice[iarray];
- if (!pArray || (pArray->vf_online == 0)) return -EINVAL;
+ if (!pArray || (pArray->vf_online == 0)) {
+ mtx_unlock(&pAdapter->lock);
+ return -EINVAL;
+ }
if(pArray->u.array.rf_verifying)
{
- oldspl = lock_driver();
pArray->u.array.rf_abort_rebuild = 1;
- unlock_driver(oldspl);
}
+ mtx_unlock(&pAdapter->lock);
return orig_length;
}
}
@@ -226,6 +244,7 @@ loop:
_vbus_(r5.enable_write_back) = *buffer-'0';
if (_vbus_(r5.enable_write_back))
hpt_printk(("RAID5 write back enabled"));
+ mtx_unlock(&pAdapter->lock);
return orig_length;
}
}
@@ -239,6 +258,7 @@ loop:
length-=9;
if (length>=1 && *buffer>='0' && *buffer<='3') {
hpt_dbg_level = *buffer-'0';
+ mtx_unlock(&pAdapter->lock);
return orig_length;
}
}
@@ -246,6 +266,7 @@ loop:
/* TO DO */
}
#endif
+ mtx_unlock(&pAdapter->lock);
return -EINVAL;
}
@@ -486,12 +507,12 @@ hpt_get_info(IAL_ADAPTER_T *pAdapter, HP
PVDevice pVDev;
#ifndef FOR_DEMO
+ mtx_lock(&pAdapter->lock);
if (pAdapter->beeping) {
- intrmask_t oldspl = lock_driver();
pAdapter->beeping = 0;
BeepOff(pAdapter->mvSataAdapter.adapterIoBaseAddress);
- unlock_driver(oldspl);
}
+ mtx_unlock(&pAdapter->lock);
#endif
hpt_copy_info(pinfo, "Controller #%d:\n\n", pAdapter->mvSataAdapter.adapterId);
@@ -610,16 +631,16 @@ out:
#define xhptregister_node(name) hptregister_node(name)
-#if (__FreeBSD_version < 500043)
+#if __FreeBSD_version >= 1100024
#define hptregister_node(name) \
- SYSCTL_NODE(, OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node") \
+ SYSCTL_ROOT_NODE(OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node"); \
SYSCTL_OID(_ ## name, OID_AUTO, status, CTLTYPE_STRING|CTLFLAG_RW, \
NULL, 0, hpt_status, "A", "Get/Set " #name " state")
-#else
+#else
#define hptregister_node(name) \
- SYSCTL_ROOT_NODE(OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node"); \
+ SYSCTL_NODE(, OID_AUTO, name, CTLFLAG_RW, 0, "Get/Set " #name " state root node"); \
SYSCTL_OID(_ ## name, OID_AUTO, status, CTLTYPE_STRING|CTLFLAG_RW, \
- NULL, 0, hpt_status, "A", "Get/Set " #name " state");
+ NULL, 0, hpt_status, "A", "Get/Set " #name " state")
#endif
xhptregister_node(PROC_DIR_NAME);
Modified: head/sys/dev/hptmv/ioctl.c
==============================================================================
--- head/sys/dev/hptmv/ioctl.c Tue Aug 5 23:55:23 2014 (r269616)
+++ head/sys/dev/hptmv/ioctl.c Tue Aug 5 23:58:49 2014 (r269617)
@@ -33,13 +33,6 @@
#include <sys/kernel.h>
#include <sys/malloc.h>
-#if (__FreeBSD_version < 500000)
-#include <sys/proc.h>
-#include <sys/kthread.h>
-#include <sys/wait.h>
-#include <sys/sysproto.h>
-#endif
-
#ifndef __KERNEL__
#define __KERNEL__
#endif
@@ -66,7 +59,7 @@ static int event_queue_head=0, event_que
static int hpt_get_event(PHPT_EVENT pEvent);
static int hpt_set_array_state(DEVICEID idArray, DWORD state);
-static intrmask_t lock_driver_idle(IAL_ADAPTER_T *pAdapter);
+static void lock_driver_idle(IAL_ADAPTER_T *pAdapter);
static void HPTLIBAPI thread_io_done(_VBUS_ARG PCommand pCmd);
static int HPTLIBAPI R1ControlSgl(_VBUS_ARG PCommand pCmd,
FPSCAT_GATH pSgTable, int logical);
@@ -158,6 +151,7 @@ ioctl_ReportEvent(UCHAR event, PVOID par
get_disk_location(&((PVDevice)param)->u.disk, &controller, &channel);
hpt_printk(("Device removed: controller %d channel %d\n", controller, channel));
}
+ wakeup(param);
}
static int
@@ -195,30 +189,17 @@ hpt_delete_array(_VBUS_ARG DEVICEID id,
/* just to prevent driver from sending more commands */
static void HPTLIBAPI nothing(_VBUS_ARG void *notused){}
-intrmask_t
+void
lock_driver_idle(IAL_ADAPTER_T *pAdapter)
{
- intrmask_t oldspl;
_VBUS_INST(&pAdapter->VBus)
- oldspl = lock_driver();
+ mtx_lock(&pAdapter->lock);
while (pAdapter->outstandingCommands) {
KdPrint(("outstandingCommands is %d, wait..\n", pAdapter->outstandingCommands));
if (!mWaitingForIdle(_VBUS_P0)) CallWhenIdle(_VBUS_P nothing, 0);
- unlock_driver(oldspl);
-/*Schedule out*/
-#if (__FreeBSD_version < 500000)
- YIELD_THREAD;
-#else
-#if (__FreeBSD_version > 700033)
- pause("switch", 1);
-#else
- tsleep(lock_driver_idle, PPAUSE, "switch", 1);
-#endif
-#endif
- oldspl = lock_driver();
+ mtx_sleep(pAdapter, &pAdapter->lock, 0, "hptidle", 0);
}
CheckIdleCall(_VBUS_P0);
- return oldspl;
}
int Kernel_DeviceIoControl(_VBUS_ARG
@@ -329,9 +310,7 @@ int Kernel_DeviceIoControl(_VBUS_ARG
default:
{
PVDevice pVDev;
-#ifdef SUPPORT_ARRAY
- intrmask_t oldspl;
-#endif
+
switch(dwIoControlCode) {
/* read-only ioctl functions can be called directly. */
case HPT_IOCTL_GET_VERSION:
@@ -382,13 +361,13 @@ int Kernel_DeviceIoControl(_VBUS_ARG
* create_array, and other functions can't be executed while channel is
* perform I/O commands. Wait until driver is idle.
*/
- oldspl = lock_driver_idle(pAdapter);
+ lock_driver_idle(pAdapter);
if (hpt_default_ioctl(_VBUS_P dwIoControlCode, lpInBuffer, nInBufferSize,
lpOutBuffer, nOutBufferSize, lpBytesReturned) == -1) {
- unlock_driver(oldspl);
+ mtx_unlock(&pAdapter->lock);
return -1;
}
- unlock_driver(oldspl);
+ mtx_unlock(&pAdapter->lock);
}
else
return -1;
@@ -401,7 +380,7 @@ int Kernel_DeviceIoControl(_VBUS_ARG
case HPT_IOCTL_CREATE_ARRAY:
{
pAdapter=(IAL_ADAPTER_T *)(ID_TO_VDEV(*(DEVICEID *)lpOutBuffer))->pVBus->OsExt;
- oldspl = lock_driver();
+ mtx_lock(&pAdapter->lock);
if(((PCREATE_ARRAY_PARAMS)lpInBuffer)->CreateFlags & CAF_CREATE_AND_DUPLICATE)
{
(ID_TO_VDEV(*(DEVICEID *)lpOutBuffer))->u.array.rf_auto_rebuild = 0;
@@ -415,7 +394,7 @@ int Kernel_DeviceIoControl(_VBUS_ARG
{
hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, ID_TO_VDEV(*(DEVICEID *)lpOutBuffer), REBUILD_PARITY);
}
- unlock_driver(oldspl);
+ mtx_unlock(&pAdapter->lock);
break;
}
@@ -423,7 +402,7 @@ int Kernel_DeviceIoControl(_VBUS_ARG
case HPT_IOCTL_CREATE_ARRAY_V2:
{
pAdapter=(IAL_ADAPTER_T *)(ID_TO_VDEV(*(DEVICEID *)lpOutBuffer))->pVBus->OsExt;
- oldspl = lock_driver();
+ mtx_lock(&pAdapter->lock);
if(((PCREATE_ARRAY_PARAMS_V2)lpInBuffer)->CreateFlags & CAF_CREATE_AND_DUPLICATE) {
(ID_TO_VDEV(*(DEVICEID *)lpOutBuffer))->u.array.rf_auto_rebuild = 0;
hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, ID_TO_VDEV(*(DEVICEID *)lpOutBuffer), DUPLICATE);
@@ -432,7 +411,7 @@ int Kernel_DeviceIoControl(_VBUS_ARG
} else if(((PCREATE_ARRAY_PARAMS_V2)lpInBuffer)->CreateFlags & CAF_CREATE_R5_BUILD_PARITY) {
hpt_queue_dpc((HPT_DPC)hpt_rebuild_data_block, pAdapter, ID_TO_VDEV(*(DEVICEID *)lpOutBuffer), REBUILD_PARITY);
}
- unlock_driver(oldspl);
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-all
mailing list