1*433d6423SLionel Sambuc #include "floppy.h" 2*433d6423SLionel Sambuc 3*433d6423SLionel Sambuc /* State management variables. */ 4*433d6423SLionel Sambuc EXTERN u16_t f_busy; 5*433d6423SLionel Sambuc EXTERN int motor_status; 6*433d6423SLionel Sambuc EXTERN unsigned f_drive; 7*433d6423SLionel Sambuc EXTERN int last_was_write; 8*433d6423SLionel Sambuc #define BSY_IO 1 /* busy doing I/O */ 9*433d6423SLionel Sambuc 10*433d6423SLionel Sambuc /* State management helpers. */ 11*433d6423SLionel Sambuc #define IS_REQUEST_PENDING(b) ((b) == BSY_IO) 12*433d6423SLionel Sambuc #define IS_READ_PENDING(b, c) \ 13*433d6423SLionel Sambuc (IS_REQUEST_PENDING((b)) && (c) == DEV_GATHER_S) 14*433d6423SLionel Sambuc #define IS_WRITE_PENDING(b, c) \ 15*433d6423SLionel Sambuc (IS_REQUEST_PENDING((b)) && (c) == DEV_SCATTER_S) 16*433d6423SLionel Sambuc #define IS_MOTOR_RUNNING(s, d) ((s) & (1 << (d))) 17*433d6423SLionel Sambuc 18*433d6423SLionel Sambuc /* Custom states definition. */ 19*433d6423SLionel Sambuc #define FL_STATE_MOTOR_OFF (SEF_LU_STATE_CUSTOM_BASE + 0) 20*433d6423SLionel Sambuc #define FL_STATE_IS_CUSTOM(s) ((s) == FL_STATE_MOTOR_OFF) 21*433d6423SLionel Sambuc 22*433d6423SLionel Sambuc /*===========================================================================* 23*433d6423SLionel Sambuc * sef_cb_lu_prepare * 24*433d6423SLionel Sambuc *===========================================================================*/ 25*433d6423SLionel Sambuc int sef_cb_lu_prepare(int state) 26*433d6423SLionel Sambuc { 27*433d6423SLionel Sambuc int is_ready; 28*433d6423SLionel Sambuc 29*433d6423SLionel Sambuc /* Check if we are ready for the target state. */ 30*433d6423SLionel Sambuc is_ready = FALSE; 31*433d6423SLionel Sambuc switch(state) { 32*433d6423SLionel Sambuc /* Standard states. */ 33*433d6423SLionel Sambuc case SEF_LU_STATE_REQUEST_FREE: 34*433d6423SLionel Sambuc case SEF_LU_STATE_PROTOCOL_FREE: 35*433d6423SLionel Sambuc is_ready = (!IS_REQUEST_PENDING(f_busy)); 36*433d6423SLionel Sambuc break; 37*433d6423SLionel Sambuc 38*433d6423SLionel Sambuc /* Custom states. */ 39*433d6423SLionel Sambuc case FL_STATE_MOTOR_OFF: 40*433d6423SLionel Sambuc is_ready = (!IS_REQUEST_PENDING(f_busy) 41*433d6423SLionel Sambuc && !IS_MOTOR_RUNNING(motor_status, f_drive)); 42*433d6423SLionel Sambuc break; 43*433d6423SLionel Sambuc } 44*433d6423SLionel Sambuc 45*433d6423SLionel Sambuc /* Tell SEF if we are ready. */ 46*433d6423SLionel Sambuc return is_ready ? OK : ENOTREADY; 47*433d6423SLionel Sambuc } 48*433d6423SLionel Sambuc 49*433d6423SLionel Sambuc /*===========================================================================* 50*433d6423SLionel Sambuc * sef_cb_lu_state_isvalid * 51*433d6423SLionel Sambuc *===========================================================================*/ 52*433d6423SLionel Sambuc int sef_cb_lu_state_isvalid(int state) 53*433d6423SLionel Sambuc { 54*433d6423SLionel Sambuc return SEF_LU_STATE_IS_STANDARD(state) || FL_STATE_IS_CUSTOM(state); 55*433d6423SLionel Sambuc } 56*433d6423SLionel Sambuc 57*433d6423SLionel Sambuc /*===========================================================================* 58*433d6423SLionel Sambuc * sef_cb_lu_state_dump * 59*433d6423SLionel Sambuc *===========================================================================*/ 60*433d6423SLionel Sambuc void sef_cb_lu_state_dump(int state) 61*433d6423SLionel Sambuc { 62*433d6423SLionel Sambuc sef_lu_dprint("floppy: live update state = %d\n", state); 63*433d6423SLionel Sambuc sef_lu_dprint("floppy: f_busy = %d\n", f_busy); 64*433d6423SLionel Sambuc sef_lu_dprint("floppy: motor_status = 0x%02X\n", motor_status); 65*433d6423SLionel Sambuc sef_lu_dprint("floppy: f_drive = %d\n", f_drive); 66*433d6423SLionel Sambuc sef_lu_dprint("floppy: last_was_write = %d\n", last_was_write); 67*433d6423SLionel Sambuc 68*433d6423SLionel Sambuc sef_lu_dprint("floppy: SEF_LU_STATE_WORK_FREE(%d) reached = %d\n", 69*433d6423SLionel Sambuc SEF_LU_STATE_WORK_FREE, TRUE); 70*433d6423SLionel Sambuc sef_lu_dprint("floppy: SEF_LU_STATE_REQUEST_FREE(%d) reached = %d\n", 71*433d6423SLionel Sambuc SEF_LU_STATE_REQUEST_FREE, (!IS_REQUEST_PENDING(f_busy))); 72*433d6423SLionel Sambuc sef_lu_dprint("floppy: SEF_LU_STATE_PROTOCOL_FREE(%d) reached = %d\n", 73*433d6423SLionel Sambuc SEF_LU_STATE_PROTOCOL_FREE, (!IS_REQUEST_PENDING(f_busy))); 74*433d6423SLionel Sambuc sef_lu_dprint("floppy: FL_STATE_MOTOR_OFF(%d) reached = %d\n", 75*433d6423SLionel Sambuc FL_STATE_MOTOR_OFF, (!IS_REQUEST_PENDING(f_busy) 76*433d6423SLionel Sambuc && !IS_MOTOR_RUNNING(motor_status, f_drive))); 77*433d6423SLionel Sambuc } 78*433d6423SLionel Sambuc 79