int ti89_send_RTS2(CalcHandle* handle, uint32_t varsize, uint8_t vartype, uint8_t hw_id) { uint8_t buffer[32] = { 0 }; uint16_t len; buffer[0] = LSB(LSW(varsize)); buffer[1] = MSB(LSW(varsize)); buffer[2] = LSB(MSW(varsize)); buffer[3] = MSB(MSW(varsize)); buffer[4] = vartype; buffer[5] = 0x00; buffer[6] = 0x08; buffer[7] = 0x00; buffer[8] = hw_id; // 0x08 -> V200, 0x09 -> Titanium (Hardware ID) len = 9; ticalcs_info(" PC->TI: RTS (size=0x%08X=%i, id=%02X, hw_id=%02x)", varsize, varsize, vartype, hw_id); TRYF(dbus_send(handle, PC_TI9X, CMD_RTS, len, buffer)); return 0; }
int dusb_send(CalcHandle* handle, RawPacket* pkt) { uint8_t buf[1023 + 5]= { 0 }; uint32_t size = pkt->size + 5; buf[0] = MSB(MSW(pkt->size)); buf[1] = LSB(MSW(pkt->size)); buf[2] = MSB(LSW(pkt->size)); buf[3] = LSB(LSW(pkt->size)); buf[4] = pkt->type; memcpy(buf+5, pkt->data, pkt->size); //printf("dusb_send: pkt->size=%d\n", pkt->size); ticables_progress_reset(handle->cable); TRYF(ticables_cable_send(handle->cable, buf, size)); if(size >= 128) ticables_progress_get(handle->cable, NULL, NULL, &handle->updat->rate); if (handle->updat->cancel) return ERR_ABORT; return 0; }
int ti89_send_VAR_h(CalcHandle* handle, uint32_t varsize, uint8_t vartype, const char *varname) { uint8_t buffer[32]; char trans[17]; uint8_t extra = (vartype == TI9X_BKUP) ? 0 : 1; ticonv_varname_to_utf8_s(handle->model, varname, trans, vartype); buffer[0] = LSB(LSW(varsize)); buffer[1] = MSB(LSW(varsize)); buffer[2] = LSB(MSW(varsize)); buffer[3] = MSB(MSW(varsize)); buffer[4] = vartype; buffer[5] = strlen(varname); memcpy(buffer + 6, varname, strlen(varname)); buffer[6 + strlen(varname)] = 0x03; ticalcs_info(" PC->TI: VAR (size=0x%08X=%i, id=%02X, name=%s)", varsize, varsize, vartype, trans); TRYF(dbus_send(handle, PC_TI9X, CMD_VAR, 6 + strlen(varname) + extra, buffer)); return 0; }
/* FLASH (special var header: size, id, flag, offset, page) */ int ti73_send_VAR2_h(CalcHandle* handle, uint32_t length, uint8_t type, uint8_t flag, uint16_t offset, uint16_t page) { uint8_t buffer[11]; buffer[0] = LSB(LSW(length)); buffer[1] = MSB(LSW(length)); buffer[2] = type; buffer[3] = LSB(MSW(length)); buffer[4] = MSB(MSW(length)); buffer[5] = flag; buffer[6] = LSB(offset); buffer[7] = MSB(offset); buffer[8] = LSB(page); buffer[9] = MSB(page); ticalcs_info(" PC->TI: VAR (size=0x%04X, id=%02X, flag=%02X, offset=%04X, page=%02X)", length, type, flag, offset, page); TRYF(dbus_send(handle, PC_TI7383, CMD_VAR, 10, buffer)); return 0; }
// Call it before ti68k_state_save to update registers with current clock // so that clock is correcly saved int rtc3_state_save(void) { TTIME rtc3_cur; TTIME d, a; if(tihw.hw_type < HW3) return 0; // get time and computes time elapsed since reload (cur - beg + load) rtc3_get_time(&rtc3_cur); rtc3_diff_time(&rtc3_cur, &tihw.rtc3_beg, &d); rtc3_add_time(&d, &tihw.rtc3_load, &a); // 1/16th of seconds tihw.io3[0x45] = (a.ms+a.ms) / 125; // seconds since January 1st, 1997 00:00:00 tihw.io3[0x46] = MSB(MSW(a.s)); tihw.io3[0x47] = LSB(MSW(a.s)); tihw.io3[0x48] = MSB(LSW(a.s)); tihw.io3[0x49] = LSB(LSW(a.s)); //printf("%i.%i\n", tihw.io3[0x49], tihw.io3[0x45]); /* rtc3_diff_time(&rtc3_cur, &tihw.rtc3_beg, &r); printf("%i.%i - %i.%i = %i.%i\n", rtc3_cur.s, rtc3_cur.ms, tihw.rtc3_beg.s, tihw.rtc3_beg.ms, r.s, r.ms); */ /* rtc3_add_time(&rtc3_cur, &tihw.rtc3_beg, &r); printf("%i.%i - %i.%i = %i.%i\n", rtc3_cur.s, rtc3_cur.ms, tihw.rtc3_beg.s, tihw.rtc3_beg.ms, r.s, r.ms); */ return 0; }
TIEXPORT3 int TICALL dusb_send(CalcHandle* handle, DUSBRawPacket* pkt) { uint8_t buf[1023 + 5]= { 0 }; uint32_t size; if (handle == NULL) { ticalcs_critical("%s: handle is NULL", __FUNCTION__); return ERR_INVALID_HANDLE; } if (pkt == NULL) { ticalcs_critical("%s: pkt is NULL", __FUNCTION__); return ERR_INVALID_PACKET; } size = pkt->size + 5; buf[0] = MSB(MSW(pkt->size)); buf[1] = LSB(MSW(pkt->size)); buf[2] = MSB(LSW(pkt->size)); buf[3] = LSB(LSW(pkt->size)); buf[4] = pkt->type; memcpy(buf+5, pkt->data, pkt->size); //printf("dusb_send: pkt->size=%d\n", pkt->size); ticables_progress_reset(handle->cable); TRYF(ticables_cable_send(handle->cable, buf, size)); if(size >= 128) ticables_progress_get(handle->cable, NULL, NULL, &handle->updat->rate); if (handle->updat->cancel) return ERR_ABORT; return 0; }
int cmd_s_put_file(CalcHandle *h, const char *name, uint32_t size) { VirtualPacket* pkt; int o; size_t len = strlen(name) < 8 ? 8 : strlen(name); ticalcs_info(" sending variable:"); pkt = nsp_vtl_pkt_new_ex(6 + len, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_FILE_MGMT); pkt->cmd = CMD_FM_PUT_FILE; pkt->data[0] = 0x01; o = put_str(pkt->data + 1, name); o++; pkt->data[o+0] = MSB(MSW(size)); pkt->data[o+1] = LSB(MSW(size)); pkt->data[o+2] = MSB(LSW(size)); pkt->data[o+3] = LSB(LSW(size)); TRYF(nsp_send_data(h, pkt)); nsp_vtl_pkt_del(pkt); return 0; }
int ti89_send_RTS_h(CalcHandle* handle, uint32_t varsize, uint8_t vartype, const char *varname) { uint8_t buffer[32] = { 0 }; uint16_t len; buffer[0] = LSB(LSW(varsize)); buffer[1] = MSB(LSW(varsize)); buffer[2] = LSB(MSW(varsize)); buffer[3] = MSB(MSW(varsize)); buffer[4] = vartype; buffer[5] = strlen(varname); memcpy(buffer + 6, varname, strlen(varname)); buffer[6 + strlen(varname)] = 0x00; len = 6 + strlen(varname) + 1; // used by AMS <= 2.09 ? //if ((vartype == TI89_AMS) || (vartype == TI89_APPL)) len--; ticalcs_info(" PC->TI: RTS (size=0x%08X=%i, id=%02X, name=%s)", varsize, varsize, vartype, varname); TRYF(dbus_send(handle, PC_TI9X, CMD_RTS, len, buffer)); return 0; }
TIEXPORT3 int TICALL dusb_send_data(CalcHandle *handle, DUSBVirtualPacket *vtl) { DUSBRawPacket raw; int i, r, q; long offset; int ret; VALIDATE_HANDLE(handle); VALIDATE_NONNULL(vtl); if (vtl->size && !vtl->data) { return ERR_INVALID_PARAMETER; } memset(&raw, 0, sizeof(raw)); do { if (vtl->size <= handle->priv.dusb_rpkt_maxlen - DUSB_DH_SIZE) { // we have a single packet which is the last one, too raw.size = vtl->size + DUSB_DH_SIZE; raw.type = DUSB_RPKT_VIRT_DATA_LAST; raw.data[0] = MSB(MSW(vtl->size)); raw.data[1] = LSB(MSW(vtl->size)); raw.data[2] = MSB(LSW(vtl->size)); raw.data[3] = LSB(LSW(vtl->size)); raw.data[4] = MSB(vtl->type); raw.data[5] = LSB(vtl->type); if (vtl->data) { memcpy(&raw.data[DUSB_DH_SIZE], vtl->data, vtl->size); } ret = dusb_send(handle, &raw); if (ret) { break; } #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data Final\n\t\t(size = %08x, type = %s)", vtl->size, dusb_vpkt_type2name(vtl->type)); #elif (VPKT_DBG == 1) ticalcs_info(" PC->TI: %s", dusb_vpkt_type2name(vtl->type)); #endif workaround_send(handle, &raw, vtl); ret = dusb_recv_acknowledge(handle); if (ret) { break; } } else { // we have more than one packet: first packet has data header raw.size = handle->priv.dusb_rpkt_maxlen; raw.type = DUSB_RPKT_VIRT_DATA; raw.data[0] = MSB(MSW(vtl->size)); raw.data[1] = LSB(MSW(vtl->size)); raw.data[2] = MSB(LSW(vtl->size)); raw.data[3] = LSB(LSW(vtl->size)); raw.data[4] = MSB(vtl->type); raw.data[5] = LSB(vtl->type); memcpy(&raw.data[DUSB_DH_SIZE], vtl->data, handle->priv.dusb_rpkt_maxlen - DUSB_DH_SIZE); offset = handle->priv.dusb_rpkt_maxlen - DUSB_DH_SIZE; ret = dusb_send(handle, &raw); if (ret) { break; } #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data with Continuation\n\t\t(size = %08x, type = %s)", vtl->size, dusb_vpkt_type2name(vtl->type)); #elif (VPKT_DBG == 1) ticalcs_info(" PC->TI: %s", dusb_vpkt_type2name(vtl->type)); #endif ret = dusb_recv_acknowledge(handle); if (ret) { break; } // other packets doesn't have data header but last one has a different type q = (vtl->size - offset) / handle->priv.dusb_rpkt_maxlen; r = (vtl->size - offset) % handle->priv.dusb_rpkt_maxlen; // send full chunks (no header) for (i = 1; i <= q; i++) { raw.size = handle->priv.dusb_rpkt_maxlen; raw.type = DUSB_RPKT_VIRT_DATA; memcpy(raw.data, vtl->data + offset, handle->priv.dusb_rpkt_maxlen); offset += handle->priv.dusb_rpkt_maxlen; ret = dusb_send(handle, &raw); if (ret) { goto end; } #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data with Continuation"); #endif ret = dusb_recv_acknowledge(handle); if (ret) { goto end; } handle->updat->max1 = vtl->size; handle->updat->cnt1 += handle->priv.dusb_rpkt_maxlen; handle->updat->pbar(); } // send last chunk (type) raw.size = r; raw.type = DUSB_RPKT_VIRT_DATA_LAST; memcpy(raw.data, vtl->data + offset, r); offset += r; ret = dusb_send(handle, &raw); if (ret) { break; } #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data Final"); #endif // XXX is that workaround necessary on 83PCE/84+CE/84+CE-T ? if (handle->model != CALC_TI84P_USB && handle->model != CALC_TI84PC_USB && handle->model != CALC_TI82A_USB && handle->model != CALC_TI84PT_USB) { workaround_send(handle, &raw, vtl); } ret = dusb_recv_acknowledge(handle); if (ret) { break; } } } while(0); end: return ret; }
/* Keybind メッセージ処理 */ INT_PTR CPropKeybind::DispatchEvent( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { WORD wNotifyCode; WORD wID; HWND hwndCtl; NMHDR* pNMHDR; static HWND hwndCombo; static HWND hwndFuncList; static HWND hwndKeyList; static HWND hwndCheckShift; static HWND hwndCheckCtrl; static HWND hwndCheckAlt; static HWND hwndAssignedkeyList; // static HWND hwndLIST_KEYSFUNC; static HWND hwndEDIT_KEYSFUNC; // int nLength; int nAssignedKeyNum; int nIndex; int nIndex2; int nIndex3; int i; int j; EFunctionCode nFuncCode; static WCHAR pszLabel[256]; switch( uMsg ){ case WM_INITDIALOG: /* ダイアログデータの設定 Keybind */ SetData( hwndDlg ); // Modified by KEITA for WIN64 2003.9.6 ::SetWindowLongPtr( hwndDlg, DWLP_USER, lParam ); /* コントロールのハンドルを取得 */ hwndCombo = ::GetDlgItem( hwndDlg, IDC_COMBO_FUNCKIND ); hwndFuncList = ::GetDlgItem( hwndDlg, IDC_LIST_FUNC ); hwndAssignedkeyList = ::GetDlgItem( hwndDlg, IDC_LIST_ASSIGNEDKEYS ); hwndCheckShift = ::GetDlgItem( hwndDlg, IDC_CHECK_SHIFT ); hwndCheckCtrl = ::GetDlgItem( hwndDlg, IDC_CHECK_CTRL ); hwndCheckAlt = ::GetDlgItem( hwndDlg, IDC_CHECK_ALT ); hwndKeyList = ::GetDlgItem( hwndDlg, IDC_LIST_KEY ); // hwndLIST_KEYSFUNC = ::GetDlgItem( hwndDlg, IDC_LIST_KEYSFUNC ); hwndEDIT_KEYSFUNC = ::GetDlgItem( hwndDlg, IDC_EDIT_KEYSFUNC ); /* キー選択時の処理 */ // From Here Oct. 14, 2000 JEPRO わかりにくいので選択しないように変更 //Oct. 17, 2000 JEPRO 復活! // /* キーリストの先頭の項目を選択(リストボックス)*/ List_SetCurSel( hwndKeyList, 0 ); //Oct. 14, 2000 JEPRO ここをコメントアウトすると先頭項目が選択されなくなる ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); //Oct. 14, 2000 JEPRO ここはどっちでもいい?(わからん) // To Here Oct. 14, 2000 ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_COMBO_FUNCKIND, CBN_SELCHANGE ), (LPARAM)hwndCombo ); ::SetTimer( hwndDlg, 1, 300, NULL ); // 2007.11.02 ryoji return TRUE; case WM_NOTIFY: pNMHDR = (NMHDR*)lParam; switch( pNMHDR->code ){ case PSN_HELP: // OnHelp( hwndDlg, IDD_PROP1P5 ); // Sept. 9, 2000 JEPRO 実際のID名に変更 OnHelp( hwndDlg, IDD_PROP_KEYBIND ); return TRUE; case PSN_KILLACTIVE: // MYTRACE( _T("Keybind PSN_KILLACTIVE\n") ); /* ダイアログデータの取得 Keybind */ GetData( hwndDlg ); return TRUE; //@@@ 2002.01.03 YAZAKI 最後に表示していたシートを正しく覚えていないバグ修正 case PSN_SETACTIVE: m_nPageNum = ID_PROPCOM_PAGENUM_KEYBOARD; // 表示を更新する(マクロ設定画面でのマクロ名変更を反映) // 2007.11.02 ryoji nIndex = List_GetCurSel( hwndKeyList ); nIndex2 = Combo_GetCurSel( hwndCombo ); nIndex3 = List_GetCurSel( hwndFuncList ); if( nIndex != LB_ERR ){ ::SendMessageAny( hwndDlg, WM_COMMAND, MAKEWPARAM( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); } if( nIndex2 != CB_ERR ){ ::SendMessageAny( hwndDlg, WM_COMMAND, MAKEWPARAM( IDC_COMBO_FUNCKIND, CBN_SELCHANGE ), (LPARAM)hwndCombo ); if( nIndex3 != LB_ERR ){ List_SetCurSel( hwndFuncList, nIndex3 ); } } return TRUE; } break; case WM_COMMAND: wNotifyCode = HIWORD(wParam); /* 通知コード */ wID = LOWORD(wParam); /* 項目ID、 コントロールID、 またはアクセラレータID */ hwndCtl = (HWND) lParam; /* コントロールのハンドル */ switch( wNotifyCode ){ /* ボタン/チェックボックスがクリックされた */ case BN_CLICKED: switch( wID ){ case IDC_BUTTON_IMPORT: /* インポート */ /* Keybind:キー割り当て設定をインポートする */ Import( hwndDlg ); return TRUE; case IDC_BUTTON_EXPORT: /* エクスポート */ /* Keybind:キー割り当て設定をエクスポートする */ Export( hwndDlg ); return TRUE; case IDC_BUTTON_ASSIGN: /* 割付 */ nIndex = List_GetCurSel( hwndKeyList ); nIndex2 = Combo_GetCurSel( hwndCombo ); nIndex3 = List_GetCurSel( hwndFuncList ); if( nIndex == LB_ERR || nIndex2 == CB_ERR || nIndex3 == LB_ERR ){ return TRUE; } nFuncCode = m_cLookup.Pos2FuncCode( nIndex2, nIndex3 ); // Oct. 2, 2001 genta i = 0; if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_SHIFT ) ){ i |= _SHIFT; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_CTRL ) ){ i |= _CTRL; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_ALT ) ){ i |= _ALT; } m_Common.m_sKeyBind.m_pKeyNameArr[nIndex].m_nFuncCodeArr[i] = nFuncCode; ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_FUNC, LBN_SELCHANGE ), (LPARAM)hwndFuncList ); return TRUE; case IDC_BUTTON_RELEASE: /* 解除 */ nIndex = List_GetCurSel( hwndKeyList ); if( nIndex == LB_ERR ){ return TRUE; } nFuncCode = F_DEFAULT; i = 0; if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_SHIFT ) ){ i |= _SHIFT; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_CTRL ) ){ i |= _CTRL; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_ALT ) ){ i |= _ALT; } m_Common.m_sKeyBind.m_pKeyNameArr[nIndex].m_nFuncCodeArr[i] = nFuncCode; ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_FUNC, LBN_SELCHANGE ), (LPARAM)hwndFuncList ); return TRUE; } break; /* BN_CLICKED */ } if( hwndCheckShift == hwndCtl || hwndCheckCtrl == hwndCtl || hwndCheckAlt == hwndCtl ){ switch( wNotifyCode ){ case BN_CLICKED: ChangeKeyList( hwndDlg ); return TRUE; } }else if( hwndKeyList == hwndCtl ){ switch( wNotifyCode ){ case LBN_SELCHANGE: nIndex = List_GetCurSel( hwndKeyList ); i = 0; if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_SHIFT ) ){ i |= _SHIFT; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_CTRL ) ){ i |= _CTRL; } if( ::IsDlgButtonChecked( hwndDlg, IDC_CHECK_ALT ) ){ i |= _ALT; } nFuncCode = m_Common.m_sKeyBind.m_pKeyNameArr[nIndex].m_nFuncCodeArr[i]; // Oct. 2, 2001 genta // 2007.11.02 ryoji F_DISABLEなら未割付 if( nFuncCode == F_DISABLE ){ auto_strncpy( pszLabel, LSW(STR_PROPCOMKEYBIND_UNASSIGN), _countof(pszLabel) - 1 ); pszLabel[_countof(pszLabel) - 1] = L'\0'; }else{ m_cLookup.Funccode2Name( nFuncCode, pszLabel, 255 ); } Wnd_SetText( hwndEDIT_KEYSFUNC, pszLabel ); return TRUE; } }else if( hwndFuncList == hwndCtl ){ switch( wNotifyCode ){ case LBN_SELCHANGE: nIndex = List_GetCurSel( hwndKeyList ); nIndex2 = Combo_GetCurSel( hwndCombo ); nIndex3 = List_GetCurSel( hwndFuncList ); nFuncCode = m_cLookup.Pos2FuncCode( nIndex2, nIndex3 ); // Oct. 2, 2001 genta /* 機能に対応するキー名の取得(複数) */ CNativeT** ppcAssignedKeyList; nAssignedKeyNum = CKeyBind::GetKeyStrList( /* 機能に対応するキー名の取得(複数) */ G_AppInstance(), m_Common.m_sKeyBind.m_nKeyNameArrNum, (KEYDATA*)m_Common.m_sKeyBind.m_pKeyNameArr, &ppcAssignedKeyList, nFuncCode, FALSE // 2007.02.22 ryoji デフォルト機能は取得しない ); /* 割り当てキーリストをクリアして値の設定 */ List_ResetContent( hwndAssignedkeyList ); if( 0 < nAssignedKeyNum){ for( j = 0; j < nAssignedKeyNum; ++j ){ /* デバッグモニタに出力 */ const TCHAR* cpszString = ppcAssignedKeyList[j]->GetStringPtr(); ::List_AddString( hwndAssignedkeyList, cpszString ); delete ppcAssignedKeyList[j]; } delete [] ppcAssignedKeyList; } return TRUE; } }else if( hwndCombo == hwndCtl){ switch( wNotifyCode ){ case CBN_SELCHANGE: nIndex2 = Combo_GetCurSel( hwndCombo ); /* 機能一覧に文字列をセット(リストボックス)*/ m_cLookup.SetListItem( hwndFuncList, nIndex2 ); // Oct. 2, 2001 genta return TRUE; } //@@@ 2001.11.08 add start MIK }else if( hwndAssignedkeyList == hwndCtl){ switch( wNotifyCode ){ case LBN_SELCHANGE: //case LBN_DBLCLK: { TCHAR buff[1024], *p; int ret; nIndex = List_GetCurSel( hwndAssignedkeyList ); auto_memset(buff, 0, _countof(buff)); ret = List_GetText( hwndAssignedkeyList, nIndex, buff); if( ret != LB_ERR ) { i = 0; p = buff; //SHIFT if( auto_memcmp(p, STR_SHIFT_PLUS, _tcslen(STR_SHIFT_PLUS)) == 0 ){ p += _tcslen(STR_SHIFT_PLUS); i |= _SHIFT; } //CTRL if( auto_memcmp(p, STR_CTRL_PLUS, _tcslen(STR_CTRL_PLUS)) == 0 ){ p += _tcslen(STR_CTRL_PLUS); i |= _CTRL; } //ALT if( auto_memcmp(p, STR_ALT_PLUS, _tcslen(STR_ALT_PLUS)) == 0 ){ p += _tcslen(STR_ALT_PLUS); i |= _ALT; } for(j = 0; j < m_Common.m_sKeyBind.m_nKeyNameArrNum; j++) { if( _tcscmp(m_Common.m_sKeyBind.m_pKeyNameArr[j].m_szKeyName, p) == 0 ) { List_SetCurSel( hwndKeyList, j); if( i & _SHIFT ) ::CheckDlgButton( hwndDlg, IDC_CHECK_SHIFT, BST_CHECKED ); //チェック else ::CheckDlgButton( hwndDlg, IDC_CHECK_SHIFT, BST_UNCHECKED ); //チェックをはずす if( i & _CTRL ) ::CheckDlgButton( hwndDlg, IDC_CHECK_CTRL, BST_CHECKED ); //チェック else ::CheckDlgButton( hwndDlg, IDC_CHECK_CTRL, BST_UNCHECKED ); //チェックをはずす if( i & _ALT ) ::CheckDlgButton( hwndDlg, IDC_CHECK_ALT, BST_CHECKED ); //チェック else ::CheckDlgButton( hwndDlg, IDC_CHECK_ALT, BST_UNCHECKED ); //チェックをはずす ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_LIST_KEY, LBN_SELCHANGE ), (LPARAM)hwndKeyList ); // キー一覧の文字列も変更 ChangeKeyList( hwndDlg ); break; } } } return TRUE; } } //@@@ 2001.11.08 add end MIK } break; case WM_TIMER: // ボタンの有効/無効を切り替える // 2007.11.02 ryoji nIndex = List_GetCurSel( hwndKeyList ); nIndex2 = Combo_GetCurSel( hwndCombo ); nIndex3 = List_GetCurSel( hwndFuncList ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_BUTTON_ASSIGN ), !( LB_ERR == nIndex || nIndex2 == CB_ERR || nIndex3 == LB_ERR ) ); ::EnableWindow( ::GetDlgItem( hwndDlg, IDC_BUTTON_RELEASE ), !( LB_ERR == nIndex ) ); break; case WM_DESTROY: ::KillTimer( hwndDlg, 1 ); // 2007.11.02 ryoji break; //@@@ 2001.02.04 Start by MIK: Popup Help case WM_HELP: { HELPINFO *p = (HELPINFO *)lParam; MyWinHelp( (HWND)p->hItemHandle, HELP_WM_HELP, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 } return TRUE; /*NOTREACHED*/ //break; //@@@ 2001.02.04 End //@@@ 2001.11.07 Start by MIK: Context Menu Help //Context Menu case WM_CONTEXTMENU: MyWinHelp( hwndDlg, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 return TRUE; //@@@ 2001.11.07 End } return FALSE; }
void io3_put_long(uint32_t addr, uint32_t arg) { io3_put_word(addr, MSW(arg)); io3_put_word(addr+2, LSW(arg)); }
/*! @return 機能が割り当てられているキーストロークの数 @date Oct. 31, 2001 genta 動的な機能名に対応するため引数追加 @date 2007.02.22 ryoji デフォルト機能割り当てに関する処理を追加 */ int CKeyBind::CreateKeyBindList( HINSTANCE hInstance, //!< [in] インスタンスハンドル int nKeyNameArrNum, //!< [in] KEYDATA* pKeyNameArr, //!< [out] CNativeW& cMemList, //!< CFuncLookup* pcFuncLookup, //!< [in] 機能番号→名前の対応を取る BOOL bGetDefFuncCode //!< [in] ON:デフォルト機能割り当てを使う/OFF:使わない デフォルト:TRUE ) { int i; int j; int nValidKeys; WCHAR pszStr[256]; WCHAR szFuncName[256]; WCHAR szFuncNameJapanese[256]; nValidKeys = 0; cMemList.SetString(LTEXT("")); const WCHAR* pszSHIFT = LTEXT("Shift+"); const WCHAR* pszCTRL = LTEXT("Ctrl+"); const WCHAR* pszALT = LTEXT("Alt+"); const WCHAR* pszTAB = LTEXT("\t"); const WCHAR* pszCR = LTEXT("\r\n"); //\r=0x0d=CRを追加 cMemList.AppendString( LSW(STR_ERR_DLGKEYBIND1) ); cMemList.AppendString( pszCR ); cMemList.AppendString( LTEXT("-----\t-----\t-----\t-----\t-----") ); cMemList.AppendString( pszCR ); for( j = 0; j < 8; ++j ){ for( i = 0; i < nKeyNameArrNum; ++i ){ int iFunc = GetFuncCodeAt( pKeyNameArr[i], j, bGetDefFuncCode ); if( 0 != iFunc ){ nValidKeys++; if( j & _SHIFT ){ cMemList.AppendString( pszSHIFT ); } if( j & _CTRL ){ cMemList.AppendString( pszCTRL ); } if( j & _ALT ){ cMemList.AppendString( pszALT ); } cMemList.AppendString( to_wchar(pKeyNameArr[i].m_szKeyName) ); // Oct. 31, 2001 genta if( !pcFuncLookup->Funccode2Name( iFunc, szFuncNameJapanese, 255 )){ auto_strcpy( szFuncNameJapanese, LSW(STR_ERR_DLGKEYBIND2) ); } szFuncName[0] = LTEXT('\0'); /*"---unknown()--"*/ // /* 機能名日本語 */ // ::LoadString( // hInstance, // pKeyNameArr[i].m_nFuncCodeArr[j], // szFuncNameJapanese, 255 // ); cMemList.AppendString( pszTAB ); cMemList.AppendString( szFuncNameJapanese ); /* 機能ID→関数名,機能名日本語 */ //@@@ 2002.2.2 YAZAKI マクロをCSMacroMgrに統一 CSMacroMgr::GetFuncInfoByID( hInstance, iFunc, szFuncName, szFuncNameJapanese ); /* 関数名 */ cMemList.AppendString( pszTAB ); cMemList.AppendString( szFuncName ); /* 機能番号 */ cMemList.AppendString( pszTAB ); auto_sprintf( pszStr, LTEXT("%d"), iFunc ); cMemList.AppendString( pszStr ); /* キーマクロに記録可能な機能かどうかを調べる */ cMemList.AppendString( pszTAB ); //@@@ 2002.2.2 YAZAKI マクロをCSMacroMgrに統一 if( CSMacroMgr::CanFuncIsKeyMacro( iFunc ) ){ cMemList.AppendString( LTEXT("○") ); }else{ cMemList.AppendString( LTEXT("×") ); } cMemList.AppendString( pszCR ); } } } return nValidKeys; }
/* ツールバーボタンリストのアイテム描画 @date 2003.08.27 Moca システムカラーのブラシはCreateSolidBrushをやめGetSysColorBrushに @date 2005.08.09 aroka CPropCommon.cpp から移動 @date 2007.11.02 ryoji ボタンとセパレータとで処理を分ける */ void CPropToolbar::DrawToolBarItemList( DRAWITEMSTRUCT* pDis ) { TBBUTTON tbb; HBRUSH hBrush; RECT rc; RECT rc0; RECT rc1; RECT rc2; // hBrush = ::CreateSolidBrush( ::GetSysColor( COLOR_WINDOW ) ); hBrush = ::GetSysColorBrush( COLOR_WINDOW ); ::FillRect( pDis->hDC, &pDis->rcItem, hBrush ); // ::DeleteObject( hBrush ); rc = pDis->rcItem; rc0 = pDis->rcItem; rc0.left += GetSystemMetrics(SM_CXSMICON) + DpiScaleX(2); rc1 = rc0; rc2 = rc0; if( (int)pDis->itemID < 0 ){ }else{ //@@@ 2002.01.03 YAZAKI m_tbMyButtonなどをCShareDataからCMenuDrawerへ移動したことによる修正。 // tbb = m_cShareData.m_tbMyButton[pDis->itemData]; // tbb = m_pcMenuDrawer->m_tbMyButton[pDis->itemData]; tbb = m_pcMenuDrawer->getButton(pDis->itemData); // ボタンとセパレータとで処理を分ける 2007.11.02 ryoji WCHAR szLabel[256]; if( tbb.fsStyle & TBSTYLE_SEP ){ // テキストだけ表示する if( tbb.idCommand == F_SEPARATOR ){ auto_strncpy( szLabel, LSW(STR_PROPCOMTOOL_ITEM1), _countof(szLabel) - 1 ); // nLength 未使用 2003/01/09 Moca szLabel[_countof(szLabel) - 1] = L'\0'; }else if( tbb.idCommand == F_MENU_NOT_USED_FIRST ){ // ツールバー折返 auto_strncpy( szLabel, LSW(STR_PROPCOMTOOL_ITEM2), _countof(szLabel) - 1 ); szLabel[_countof(szLabel) - 1] = L'\0'; }else{ auto_strncpy( szLabel, LSW(STR_PROPCOMTOOL_ITEM3), _countof(szLabel) - 1 ); szLabel[_countof(szLabel) - 1] = L'\0'; } // From Here Oct. 15, 2001 genta }else{ // アイコンとテキストを表示する m_pcIcons->Draw( tbb.iBitmap, pDis->hDC, rc.left + 2, rc.top + 2, ILD_NORMAL ); m_cLookup.Funccode2Name( tbb.idCommand, szLabel, _countof( szLabel ) ); } // To Here Oct. 15, 2001 genta /* アイテムが選択されている */ if( pDis->itemState & ODS_SELECTED ){ // hBrush = ::CreateSolidBrush( ::GetSysColor( COLOR_HIGHLIGHT ) ); hBrush = ::GetSysColorBrush( COLOR_HIGHLIGHT ); ::SetTextColor( pDis->hDC, ::GetSysColor( COLOR_HIGHLIGHTTEXT ) ); }else{ // hBrush = ::CreateSolidBrush( ::GetSysColor( COLOR_WINDOW ) ); hBrush = ::GetSysColorBrush( COLOR_WINDOW ); ::SetTextColor( pDis->hDC, ::GetSysColor( COLOR_WINDOWTEXT ) ); } rc1.left++; rc1.top++; rc1.right--; rc1.bottom--; ::FillRect( pDis->hDC, &rc1, hBrush ); // ::DeleteObject( hBrush ); ::SetBkMode( pDis->hDC, TRANSPARENT ); // 2014.11.25 topマージンが2固定だとフォントが大きい時に見切れるので変数に変更 TextOutW_AnyBuild( pDis->hDC, rc1.left + 4, rc1.top + nToolBarListBoxTopMargin, szLabel, wcslen( szLabel ) ); } /* アイテムにフォーカスがある */ if( pDis->itemState & ODS_FOCUS ){ ::DrawFocusRect( pDis->hDC, &rc2 ); } return; }
// 0x000B: request to send static int dusb_cmd_s_rts2(CalcHandle *handle, const char *folder, const char *name, uint32_t size, unsigned int nattrs, const DUSBCalcAttr **attrs, int modeflag) { DUSBVirtualPacket* pkt; int pks; unsigned int i; unsigned int j = 0; int retval = 0; VALIDATE_HANDLE(handle); VALIDATE_NONNULL(folder); VALIDATE_NONNULL(name); VALIDATE_ATTRS(nattrs, attrs); pks = 2 + strlen(name) + 1 + 5 + 2; if (strlen(folder)) { pks += strlen(folder)+1; } for (i = 0; i < nattrs; i++) { pks += 4 + attrs[i]->size; } pkt = dusb_vtl_pkt_new_ex(handle, pks, DUSB_VPKT_RTS, dusb_vtl_pkt_alloc_data(pks)); if (strlen(folder)) { pkt->data[j++] = strlen(folder); memcpy(pkt->data + j, folder, strlen(folder)+1); j += strlen(folder)+1; } else { pkt->data[j++] = 0; } pkt->data[j++] = strlen(name); memcpy(pkt->data + j, name, strlen(name)+1); j += strlen(name)+1; pkt->data[j++] = MSB(MSW(size)); pkt->data[j++] = LSB(MSW(size)); pkt->data[j++] = MSB(LSW(size)); pkt->data[j++] = LSB(LSW(size)); pkt->data[j++] = modeflag; pkt->data[j++] = MSB(nattrs); pkt->data[j++] = LSB(nattrs); for (i = 0; i < nattrs; i++) { pkt->data[j++] = MSB(attrs[i]->id); pkt->data[j++] = LSB(attrs[i]->id); pkt->data[j++] = MSB(attrs[i]->size); pkt->data[j++] = LSB(attrs[i]->size); memcpy(pkt->data + j, attrs[i]->data, attrs[i]->size); byteswap(pkt->data + j, attrs[i]->size); j += attrs[i]->size; } retval = dusb_send_data(handle, pkt); dusb_vtl_pkt_del(handle, pkt); ticalcs_info(" folder=%s, name=%s, size=%i, nattrs=%i", folder, name, size, nattrs); return retval; }
static int set_clock (CalcHandle* handle, CalcClock* _clock) { CalcParam *param; uint32_t calc_time; struct tm ref, cur; time_t r, c, now; time(&now); memcpy(&ref, localtime(&now), sizeof(struct tm)); ref.tm_year = 1997 - 1900; ref.tm_mon = 0; ref.tm_yday = 0; ref.tm_mday = 1; ref.tm_wday = 3; ref.tm_hour = 0; ref.tm_min = 0; ref.tm_sec = 0; //ref.tm_isdst = 1; r = mktime(&ref); cur.tm_year = _clock->year - 1900; cur.tm_mon = _clock->month - 1; cur.tm_mday = _clock->day; cur.tm_hour = _clock->hours; cur.tm_min = _clock->minutes; cur.tm_sec = _clock->seconds; cur.tm_isdst = 1; c = mktime(&cur); calc_time = (uint32_t)difftime(c, r); g_snprintf(update_->text, sizeof(update_->text), _("Setting clock...")); update_label(); param = cp_new(PID_CLK_SEC, 4); param->data[0] = MSB(MSW(calc_time)); param->data[1] = LSB(MSW(calc_time)); param->data[2] = MSB(LSW(calc_time)); param->data[3] = LSB(LSW(calc_time)); TRYF(cmd_s_param_set(handle, param)); TRYF(cmd_r_data_ack(handle)); cp_del(param); param = cp_new(PID_CLK_DATE_FMT, 1); param->data[0] = _clock->date_format == 3 ? 0 : _clock->date_format; TRYF(cmd_s_param_set(handle, param)); TRYF(cmd_r_data_ack(handle)); cp_del(param); param = cp_new(PID_CLK_TIME_FMT, 1); param->data[0] = _clock->time_format == 24 ? 1 : 0; TRYF(cmd_s_param_set(handle, param)); TRYF(cmd_r_data_ack(handle)); cp_del(param); param = cp_new(PID_CLK_ON, 1); param->data[0] = _clock->state; TRYF(cmd_s_param_set(handle, param)); TRYF(cmd_r_data_ack(handle)); cp_del(param); return 0; }
static int set_clock (CalcHandle* handle, CalcClock* _clock) { int ret; uint8_t buffer[9]; uint32_t calc_time; struct tm ref, cur; time_t r, c, now; time(&now); // retrieve current DST setting memcpy(&ref, localtime(&now), sizeof(struct tm)); ref.tm_year = 1997 - 1900; ref.tm_mon = 0; ref.tm_yday = 0; ref.tm_mday = 1; ref.tm_wday = 3; ref.tm_hour = 0; ref.tm_min = 0; ref.tm_sec = 0; //ref.tm_isdst = 1; r = mktime(&ref); //printf("%s\n", asctime(&ref)); cur.tm_year = _clock->year - 1900; cur.tm_mon = _clock->month - 1; cur.tm_mday = _clock->day; cur.tm_hour = _clock->hours; cur.tm_min = _clock->minutes; cur.tm_sec = _clock->seconds; cur.tm_isdst = 1; c = mktime(&cur); //printf("%s\n", asctime(&cur)); calc_time = (uint32_t)difftime(c, r); buffer[0] = 0; buffer[1] = 0; buffer[2] = MSB(MSW(calc_time)); buffer[3] = LSB(MSW(calc_time)); buffer[4] = MSB(LSW(calc_time)); buffer[5] = LSB(LSW(calc_time)); buffer[6] = _clock->date_format; buffer[7] = _clock->time_format; buffer[8] = 0xff; ticalcs_strlcpy(handle->updat->text, _("Setting clock..."), sizeof(handle->updat->text)); ticalcs_update_label(handle); ret = SEND_RTS(handle, 13, TI73_CLK, "\0x08\0\0\0\0\0\0\0", 0x00, 0x00); if (!ret) { ret = RECV_ACK(handle, NULL); if (!ret) { ret = RECV_CTS(handle, 13); if (!ret) { ret = SEND_ACK(handle); if (!ret) { ret = SEND_XDP(handle, 9, buffer); if (!ret) { ret = RECV_ACK(handle, NULL); if (!ret) { ret = SEND_EOT(handle); } } } } } } return ret; }
/*! バックアップファイルの詳細設定エディットボックスを適切に更新する @date 2005.11.07 aroka 新規追加 @note 詳細設定切り替え時のデフォルトをオプションに合わせるため、 m_szBackUpPathAdvanced を更新する */ void CPropBackup::UpdateBackupFile(HWND hwndDlg) // バックアップファイルの詳細設定 { wchar_t temp[MAX_PATH]; /* バックアップを作成するファイル */ // 20051107 aroka if( !m_Common.m_sBackup.m_bBackUp ){ temp[0] = LTEXT('\0'); } else{ if( m_Common.m_sBackup.m_bBackUpFolder ){ temp[0] = LTEXT('\0'); } else if( m_Common.m_sBackup.m_bBackUpDustBox ){ auto_sprintf( temp, LTEXT("%ls\\"), LSW(STR_PROPCOMBK_DUSTBOX) ); } else{ auto_sprintf( temp, LTEXT(".\\") ); } switch( m_Common.m_sBackup.GetBackupType() ){ case 1: // .bak wcscat( temp, LTEXT("$0.bak") ); break; case 5: // .*.bak wcscat( temp, LTEXT("$0.*.bak") ); break; case 3: // .b?? wcscat( temp, LTEXT("$0.b??") ); break; case 6: // .*.b?? wcscat( temp, LTEXT("$0.*.b??") ); break; case 2: // 日付,時刻 case 4: // 日付,時刻 wcscat( temp, LTEXT("$0_") ); if( m_Common.m_sBackup.GetBackupOpt(BKUP_YEAR) ){ /* バックアップファイル名:日付の年 */ wcscat( temp, LTEXT("%Y") ); } if( m_Common.m_sBackup.GetBackupOpt(BKUP_MONTH) ){ /* バックアップファイル名:日付の月 */ wcscat( temp, LTEXT("%m") ); } if( m_Common.m_sBackup.GetBackupOpt(BKUP_DAY) ){ /* バックアップファイル名:日付の日 */ wcscat( temp, LTEXT("%d") ); } if( m_Common.m_sBackup.GetBackupOpt(BKUP_HOUR) ){ /* バックアップファイル名:日付の時 */ wcscat( temp, LTEXT("%H") ); } if( m_Common.m_sBackup.GetBackupOpt(BKUP_MIN) ){ /* バックアップファイル名:日付の分 */ wcscat( temp, LTEXT("%M") ); } if( m_Common.m_sBackup.GetBackupOpt(BKUP_SEC) ){ /* バックアップファイル名:日付の秒 */ wcscat( temp, LTEXT("%S") ); } wcscat( temp, LTEXT(".*") ); break; default: break; } } if( !m_Common.m_sBackup.m_bBackUpPathAdvanced ){ // 詳細設定モードでないときだけ自動更新する auto_sprintf( m_Common.m_sBackup.m_szBackUpPathAdvanced, _T("%ls"), temp ); ::DlgItem_SetText( hwndDlg, IDC_EDIT_BACKUPFILE, m_Common.m_sBackup.m_szBackUpPathAdvanced ); } return; }
static int qla24xx_dump_memory(scsi_qla_host_t *ha, uint32_t *code_ram, uint32_t cram_size, uint32_t *ext_mem, void **nxt) { int rval; uint32_t cnt, stat, timer, risc_address, ext_mem_cnt; uint16_t mb[4]; struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; rval = QLA_SUCCESS; risc_address = ext_mem_cnt = 0; memset(mb, 0, sizeof(mb)); /* Code RAM. */ risc_address = 0x20000; WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_EXTENDED); clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); for (cnt = 0; cnt < cram_size / 4 && rval == QLA_SUCCESS; cnt++, risc_address++) { WRT_REG_WORD(®->mailbox1, LSW(risc_address)); WRT_REG_WORD(®->mailbox8, MSW(risc_address)); RD_REG_WORD(®->mailbox8); WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT); for (timer = 6000000; timer; timer--) { /* Check for pending interrupts. */ stat = RD_REG_DWORD(®->host_status); if (stat & HSRX_RISC_INT) { stat &= 0xff; if (stat == 0x1 || stat == 0x2 || stat == 0x10 || stat == 0x11) { set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); mb[0] = RD_REG_WORD(®->mailbox0); mb[2] = RD_REG_WORD(®->mailbox2); mb[3] = RD_REG_WORD(®->mailbox3); WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); RD_REG_DWORD(®->hccr); break; } /* Clear this intr; it wasn't a mailbox intr */ WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); RD_REG_DWORD(®->hccr); } udelay(5); } if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb[0] & MBS_MASK; code_ram[cnt] = htonl((mb[3] << 16) | mb[2]); } else { rval = QLA_FUNCTION_FAILED; } } if (rval == QLA_SUCCESS) { /* External Memory. */ risc_address = 0x100000; ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1; WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_EXTENDED); clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); } for (cnt = 0; cnt < ext_mem_cnt && rval == QLA_SUCCESS; cnt++, risc_address++) { WRT_REG_WORD(®->mailbox1, LSW(risc_address)); WRT_REG_WORD(®->mailbox8, MSW(risc_address)); RD_REG_WORD(®->mailbox8); WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT); for (timer = 6000000; timer; timer--) { /* Check for pending interrupts. */ stat = RD_REG_DWORD(®->host_status); if (stat & HSRX_RISC_INT) { stat &= 0xff; if (stat == 0x1 || stat == 0x2 || stat == 0x10 || stat == 0x11) { set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); mb[0] = RD_REG_WORD(®->mailbox0); mb[2] = RD_REG_WORD(®->mailbox2); mb[3] = RD_REG_WORD(®->mailbox3); WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); RD_REG_DWORD(®->hccr); break; } /* Clear this intr; it wasn't a mailbox intr */ WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); RD_REG_DWORD(®->hccr); } udelay(5); } if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb[0] & MBS_MASK; ext_mem[cnt] = htonl((mb[3] << 16) | mb[2]); } else { rval = QLA_FUNCTION_FAILED; } } *nxt = rval == QLA_SUCCESS ? &ext_mem[cnt]: NULL; return rval; }
/* Convert an upgrade into an image. The image has neither boot block nor certificate. */ int ti68k_convert_tib_to_image(const char *srcname, const char *dirname, char **dstname, int hw_type) { FILE *f; int err; IMG_INFO img; char *ext; gchar *basename; int i, j; int num_blocks, last_block; int real_size; HW_PARM_BLOCK hwpb; *dstname = NULL; // No filename, exits if(!strcmp(g_basename(srcname), "")) return ERR_CANT_OPEN; // Preload upgrade memset(&img, 0, sizeof(IMG_INFO)); err = ti68k_get_tib_infos(srcname, &img, !0); if(err) { free(img.data); tiemu_info(_("Unable to get information on FLASH upgrade: <%s>"), srcname); return err; } ti68k_display_tib_infos(&img); // Create destination file basename = g_path_get_basename(srcname); ext = strrchr(basename, '.'); *ext='\0'; strcat(basename, ".img"); *dstname = g_strconcat(dirname, basename, NULL); g_free(basename); // Open dest file f = fopen(*dstname, "wb"); if(f == NULL) { tiemu_warning("Unable to open this file: <%s>\n", *dstname); return ERR_CANT_OPEN; } // Fill header strcpy(img.signature, IMG_SIGN); img.header_size = sizeof(IMG_INFO); img.revision = IMG_REV; real_size = img.size - SPP; img.size = ti68k_get_rom_size(img.calc_type); img.hw_type = hw_type; if(hw_type == -1) { if(img.calc_type == TI89t) img.hw_type = HW3; //default else if(img.calc_type == TI89 || img.calc_type == TI92p || img.calc_type == V200) img.hw_type = HW2; // default } // Write header if (fwrite(&img, 1, sizeof(IMG_INFO), f) < sizeof(IMG_INFO)) { tiemu_warning("Failed to write to file: <%s>\n", *dstname); fclose(f); return ERR_CANT_OPEN; } // Write boot block memcpy(img.data, &img.data[SPP + BO], 256); if (fwrite(img.data, 1, 256, f) < 256) { tiemu_warning("Failed to write to file: <%s>\n", *dstname); fclose(f); return ERR_CANT_OPEN; } // Write hardware param block // fill structure hwpb.len = 24; switch(img.calc_type) { case TI89: hwpb.hardwareID = HWID_TI89; hwpb.hardwareRevision = img.hw_type - 1; break; case TI92p: hwpb.hardwareID = HWID_TI92P; hwpb.hardwareRevision = img.hw_type - 1; break; case V200: hwpb.hardwareID = HWID_V200; hwpb.hardwareRevision = 2; break; case TI89t: hwpb.hardwareID = HWID_TI89T; hwpb.hardwareRevision = 2; break; } hwpb.bootMajor = hwpb.bootRevision = hwpb.bootBuild = 1; hwpb.gateArray = img.hw_type; ti68k_put_hw_param_block((uint8_t *)img.data, img.rom_base, &hwpb); // write filler if (fputc(0xfe, f) < 0 || fputc(0xed, f) < 0 || fputc(0xba, f) < 0 || fputc(0xbe, f) < 0 //fwrite(&hwpb, 1hwpb.len+2, f); // write address (pointer) || fputc(0x00, f) < 0 || fputc(img.rom_base, f) < 0 || fputc(0x01, f) < 0 || fputc(0x08, f) < 0 // write structure || fputc(MSB(hwpb.len), f) < 0 || fputc(LSB(hwpb.len), f) < 0 || fputc(MSB(MSW(hwpb.hardwareID)), f) < 0 || fputc(LSB(MSW(hwpb.hardwareID)), f) < 0 || fputc(MSB(LSW(hwpb.hardwareID)), f) < 0 || fputc(LSB(LSW(hwpb.hardwareID)), f) < 0 || fputc(MSB(MSW(hwpb.hardwareRevision)), f) < 0 || fputc(LSB(MSW(hwpb.hardwareRevision)), f) < 0 || fputc(MSB(LSW(hwpb.hardwareRevision)), f) < 0 || fputc(LSB(LSW(hwpb.hardwareRevision)), f) < 0 || fputc(MSB(MSW(hwpb.bootMajor)), f) < 0 || fputc(LSB(MSW(hwpb.bootMajor)), f) < 0 || fputc(MSB(LSW(hwpb.bootMajor)), f) < 0 || fputc(LSB(LSW(hwpb.bootMajor)), f) < 0 || fputc(MSB(MSW(hwpb.hardwareRevision)), f) < 0 || fputc(LSB(MSW(hwpb.hardwareRevision)), f) < 0 || fputc(MSB(LSW(hwpb.hardwareRevision)), f) < 0 || fputc(LSB(LSW(hwpb.hardwareRevision)), f) < 0 || fputc(MSB(MSW(hwpb.bootBuild)), f) < 0 || fputc(LSB(MSW(hwpb.bootBuild)), f) < 0 || fputc(MSB(LSW(hwpb.bootBuild)), f) < 0 || fputc(LSB(LSW(hwpb.bootBuild)), f) < 0 || fputc(MSB(MSW(hwpb.gateArray)), f) < 0 || fputc(LSB(MSW(hwpb.gateArray)), f) < 0 || fputc(MSB(LSW(hwpb.gateArray)), f) < 0 || fputc(LSB(LSW(hwpb.gateArray)), f) < 0) { tiemu_warning("Failed to write to file: <%s>\n", *dstname); fclose(f); return ERR_CANT_OPEN; } // Fill with 0xff up-to System Part for(i = 0x108 + hwpb.len+2; i < SPP; i++) if (fputc(0xff, f) < 0) { tiemu_warning("Failed to write to file: <%s>\n", *dstname); fclose(f); return ERR_CANT_OPEN; } // Copy FLASH upgrade at 0x12000 (SPP) num_blocks = real_size / 65536; for(i = 0; i < num_blocks; i++ ) { tiemu_info("."); fflush(stdout); if (fwrite(&img.data[65536 * i + SPP], sizeof(char), 65536, f) < 65536) { tiemu_warning("Failed to write to file: <%s>\n", *dstname); fclose(f); return ERR_CANT_OPEN; } } last_block = real_size % 65536; if (fwrite(&img.data[65536 * i + SPP], sizeof(char), last_block, f) < (size_t)last_block) { tiemu_warning("Failed to write to file: <%s>\n", *dstname); fclose(f); return ERR_CANT_OPEN; } tiemu_info(""); tiemu_info("Completing to %iMB size\n", img.size >> 20); for(j = SPP + real_size; j < img.size; j++) if (fputc(0xff, f) < 0) { tiemu_warning("Failed to write to file: <%s>\n", *dstname); fclose(f); return ERR_CANT_OPEN; } // Close file if (fclose(f)) { tiemu_warning("Failed to close file: <%s>\n", *dstname); return ERR_CANT_OPEN; } return 0; }
/* ダイアログデータの設定 */ void CDlgJump::SetData( void ) { CEditDoc* pCEditDoc = (CEditDoc*)m_lParam; CFuncInfoArr cFuncInfoArr; int i; HWND hwndCtrl; wchar_t szText[1024]; int nIndexCurSel = 0; // Sep. 11, 2004 genta 初期化 int nIndex; int nWorkLine; //$$ 条件により、レイアウト・ロジックの単位が混在するため、ミスの原因になりやすい int nPLSQLBlockNum; // GetHwnd() = hwndDlg; //From Here Oct. 7, 2000 JEPRO 前回入力した行番号を保持するように下行を変更 // ::DlgItem_SetText( GetHwnd(), IDC_EDIT_LINENUM, "" ); /* 行番号 */ if( 0 == m_nLineNum ){ ::DlgItem_SetText( GetHwnd(), IDC_EDIT_LINENUM, _T("") ); /* 行番号 */ }else{ ::SetDlgItemInt( GetHwnd(), IDC_EDIT_LINENUM, m_nLineNum, FALSE ); /* 前回の行番号 */ } //To Here Oct. 7, 2000 ::SetDlgItemInt( GetHwnd(), IDC_EDIT_PLSQL_E1, m_nPLSQL_E1, FALSE ); /* PL/SQL関数リスト作成 */ hwndCtrl = ::GetDlgItem( GetHwnd(), IDC_COMBO_PLSQLBLOCKS ); /* タイプ別に設定されたアウトライン解析方法 */ if( OUTLINE_PLSQL == pCEditDoc->m_cDocType.GetDocumentAttribute().m_eDefaultOutline ){ pCEditDoc->m_cDocOutline.MakeFuncList_PLSQL( &cFuncInfoArr ); } nWorkLine = -1; nIndex = 0; nPLSQLBlockNum = 0; for( i = 0; i < cFuncInfoArr.GetNum(); ++i ){ if( 31 == cFuncInfoArr.GetAt( i )->m_nInfo || 41 == cFuncInfoArr.GetAt( i )->m_nInfo ){ } if( 31 == cFuncInfoArr.GetAt( i )->m_nInfo ){ if( m_pShareData->m_bLineNumIsCRLF_ForJump ){ /* 行番号の表示 false=折り返し単位/true=改行単位 */ auto_sprintf( szText, LSW(STR_DLGJUMP_PSLQL), cFuncInfoArr.GetAt( i )->m_nFuncLineCRLF, cFuncInfoArr.GetAt( i )->m_cmemFuncName.GetStringPtr() ); }else{ auto_sprintf( szText, LSW(STR_DLGJUMP_PSLQL), cFuncInfoArr.GetAt( i )->m_nFuncLineLAYOUT, cFuncInfoArr.GetAt( i )->m_cmemFuncName.GetStringPtr() ); } nIndex = Combo_AddString( hwndCtrl, szText ); if( m_pShareData->m_bLineNumIsCRLF_ForJump ){ /* 行番号の表示 false=折り返し単位/true=改行単位 */ Combo_SetItemData( hwndCtrl, nIndex, (Int)cFuncInfoArr.GetAt( i )->m_nFuncLineCRLF ); } else{ Combo_SetItemData( hwndCtrl, nIndex, (Int)cFuncInfoArr.GetAt( i )->m_nFuncLineLAYOUT ); } nPLSQLBlockNum++; } if( 41 == cFuncInfoArr.GetAt( i )->m_nInfo ){ if( m_pShareData->m_bLineNumIsCRLF_ForJump ){ /* 行番号の表示 false=折り返し単位/true=改行単位 */ auto_sprintf( szText, LSW(STR_DLGJUMP_PSLQL), cFuncInfoArr.GetAt( i )->m_nFuncLineCRLF, cFuncInfoArr.GetAt( i )->m_cmemFuncName.GetStringPtr() ); }else{ auto_sprintf( szText, LSW(STR_DLGJUMP_PSLQL), cFuncInfoArr.GetAt( i )->m_nFuncLineLAYOUT, cFuncInfoArr.GetAt( i )->m_cmemFuncName.GetStringPtr() ); } nIndexCurSel = nIndex = Combo_AddString( hwndCtrl, szText ); if( m_pShareData->m_bLineNumIsCRLF_ForJump ){ /* 行番号の表示 false=折り返し単位/true=改行単位 */ nWorkLine = (Int)cFuncInfoArr.GetAt( i )->m_nFuncLineCRLF; Combo_SetItemData( hwndCtrl, nIndex, (Int)cFuncInfoArr.GetAt( i )->m_nFuncLineCRLF ); }else{ nWorkLine = (Int)cFuncInfoArr.GetAt( i )->m_nFuncLineLAYOUT; Combo_SetItemData( hwndCtrl, nIndex, (Int)cFuncInfoArr.GetAt( i )->m_nFuncLineLAYOUT ); } ++nPLSQLBlockNum; } } Combo_SetCurSel( hwndCtrl, nIndexCurSel ); /* PL/SQLのパッケージ本体が検出された場合 */ if( -1 != nWorkLine ){ m_nPLSQL_E1 = nWorkLine; ::SetDlgItemInt( GetHwnd(), IDC_EDIT_PLSQL_E1, m_nPLSQL_E1, FALSE ); } /* PL/SQLのパッケージブロックが検出された場合 */ if( 0 < nPLSQLBlockNum ){ m_bPLSQL = TRUE; } ::CheckDlgButton( GetHwnd(), IDC_CHECK_PLSQL, m_bPLSQL ); /* PL/SQLソースの有効行か */ if( BST_CHECKED == ::IsDlgButtonChecked( GetHwnd(), IDC_CHECK_PLSQL ) ){ ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_LABEL_PLSQL1 ), TRUE ); //Sept. 12, 2000 JEPRO ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_LABEL_PLSQL2 ), TRUE ); //Sept. 12, 2000 JEPRO ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_LABEL_PLSQL3 ), TRUE ); //Sept. 12, 2000 JEPRO ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_EDIT_PLSQL_E1 ), TRUE ); ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_SPIN_PLSQL_E1 ), TRUE ); //Oct. 6, 2000 JEPRO ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_COMBO_PLSQLBLOCKS ), TRUE ); m_pShareData->m_bLineNumIsCRLF_ForJump = true; ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_RADIO_LINENUM_LAYOUT ), FALSE ); ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_RADIO_LINENUM_CRLF ), FALSE ); }else{ ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_LABEL_PLSQL1 ), FALSE ); //Sept. 12, 2000 JEPRO ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_LABEL_PLSQL2 ), FALSE ); //Sept. 12, 2000 JEPRO ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_LABEL_PLSQL3 ), FALSE ); //Sept. 12, 2000 JEPRO ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_EDIT_PLSQL_E1 ), FALSE ); ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_SPIN_PLSQL_E1 ), FALSE ); //Oct. 6, 2000 JEPRO ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_COMBO_PLSQLBLOCKS ), FALSE ); ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_RADIO_LINENUM_LAYOUT ), TRUE ); ::EnableWindow( ::GetDlgItem( GetHwnd(), IDC_RADIO_LINENUM_CRLF ), TRUE ); } /* 行番号の表示 false=折り返し単位/true=改行単位 */ if( m_pShareData->m_bLineNumIsCRLF_ForJump ){ ::CheckDlgButton( GetHwnd(), IDC_RADIO_LINENUM_LAYOUT, FALSE ); ::CheckDlgButton( GetHwnd(), IDC_RADIO_LINENUM_CRLF, TRUE ); }else{ ::CheckDlgButton( GetHwnd(), IDC_RADIO_LINENUM_LAYOUT, TRUE ); ::CheckDlgButton( GetHwnd(), IDC_RADIO_LINENUM_CRLF, FALSE ); } return; }
/** * qla2x00_async_event() - Process aynchronous events. * @ha: SCSI driver HA context * @mb0: Mailbox0 register */ static void qla2x00_async_event(scsi_qla_host_t *ha, uint32_t mbx) { static char *link_speeds[5] = { "1", "2", "4", "?", "10" }; char *link_speed; uint16_t mb[4]; uint16_t handle_cnt; uint16_t cnt; uint32_t handles[5]; device_reg_t *reg = ha->iobase; uint32_t rscn_entry, host_pid; uint8_t rscn_queue_index; /* Setup to process RIO completion. */ handle_cnt = 0; mb[0] = LSW(mbx); switch (mb[0]) { case MBA_SCSI_COMPLETION: if (IS_QLA2100(ha) || IS_QLA2200(ha)) handles[0] = le32_to_cpu( ((uint32_t)(RD_MAILBOX_REG(ha, reg, 2) << 16)) | RD_MAILBOX_REG(ha, reg, 1)); else handles[0] = le32_to_cpu( ((uint32_t)(RD_MAILBOX_REG(ha, reg, 2) << 16)) | MSW(mbx)); handle_cnt = 1; break; case MBA_CMPLT_1_16BIT: if (IS_QLA2100(ha) || IS_QLA2200(ha)) handles[0] = (uint32_t)RD_MAILBOX_REG(ha, reg, 1); else handles[0] = MSW(mbx); handle_cnt = 1; mb[0] = MBA_SCSI_COMPLETION; break; case MBA_CMPLT_2_16BIT: handles[0] = (uint32_t)RD_MAILBOX_REG(ha, reg, 1); handles[1] = (uint32_t)RD_MAILBOX_REG(ha, reg, 2); handle_cnt = 2; mb[0] = MBA_SCSI_COMPLETION; break; case MBA_CMPLT_3_16BIT: handles[0] = (uint32_t)RD_MAILBOX_REG(ha, reg, 1); handles[1] = (uint32_t)RD_MAILBOX_REG(ha, reg, 2); handles[2] = (uint32_t)RD_MAILBOX_REG(ha, reg, 3); handle_cnt = 3; mb[0] = MBA_SCSI_COMPLETION; break; case MBA_CMPLT_4_16BIT: handles[0] = (uint32_t)RD_MAILBOX_REG(ha, reg, 1); handles[1] = (uint32_t)RD_MAILBOX_REG(ha, reg, 2); handles[2] = (uint32_t)RD_MAILBOX_REG(ha, reg, 3); handles[3] = (uint32_t)RD_MAILBOX_REG(ha, reg, 6); handle_cnt = 4; mb[0] = MBA_SCSI_COMPLETION; break; case MBA_CMPLT_5_16BIT: handles[0] = (uint32_t)RD_MAILBOX_REG(ha, reg, 1); handles[1] = (uint32_t)RD_MAILBOX_REG(ha, reg, 2); handles[2] = (uint32_t)RD_MAILBOX_REG(ha, reg, 3); handles[3] = (uint32_t)RD_MAILBOX_REG(ha, reg, 6); handles[4] = (uint32_t)RD_MAILBOX_REG(ha, reg, 7); handle_cnt = 5; mb[0] = MBA_SCSI_COMPLETION; break; case MBA_CMPLT_2_32BIT: handles[0] = le32_to_cpu( ((uint32_t)(RD_MAILBOX_REG(ha, reg, 2) << 16)) | RD_MAILBOX_REG(ha, reg, 1)); handles[1] = le32_to_cpu( ((uint32_t)(RD_MAILBOX_REG(ha, reg, 7) << 16)) | RD_MAILBOX_REG(ha, reg, 6)); handle_cnt = 2; mb[0] = MBA_SCSI_COMPLETION; break; default: break; } mb[0] = LSW(mbx); switch (mb[0]) { case MBA_SCSI_COMPLETION: /* Fast Post */ if (!ha->flags.online) break; for (cnt = 0; cnt < handle_cnt; cnt++) qla2x00_process_completed_request(ha, handles[cnt]); break; case MBA_RESET: /* Reset */ DEBUG2(printk("scsi(%ld): Asynchronous RESET.\n", ha->host_no)); set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); break; case MBA_SYSTEM_ERR: /* System Error */ mb[1] = RD_MAILBOX_REG(ha, reg, 1); mb[2] = RD_MAILBOX_REG(ha, reg, 2); mb[3] = RD_MAILBOX_REG(ha, reg, 3); qla_printk(KERN_INFO, ha, "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh.\n", mb[1], mb[2], mb[3]); if (IS_QLA2100(ha) || IS_QLA2200(ha)) qla2100_fw_dump(ha, 1); else qla2300_fw_dump(ha, 1); set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); break; case MBA_REQ_TRANSFER_ERR: /* Request Transfer Error */ DEBUG2(printk("scsi(%ld): ISP Request Transfer Error.\n", ha->host_no)); qla_printk(KERN_WARNING, ha, "ISP Request Transfer Error.\n"); set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); break; case MBA_RSP_TRANSFER_ERR: /* Response Transfer Error */ DEBUG2(printk("scsi(%ld): ISP Response Transfer Error.\n", ha->host_no)); qla_printk(KERN_WARNING, ha, "ISP Response Transfer Error.\n"); set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); break; case MBA_WAKEUP_THRES: /* Request Queue Wake-up */ DEBUG2(printk("scsi(%ld): Asynchronous WAKEUP_THRES.\n", ha->host_no)); break; case MBA_LIP_OCCURRED: /* Loop Initialization Procedure */ mb[1] = RD_MAILBOX_REG(ha, reg, 1); DEBUG2(printk("scsi(%ld): LIP occured (%x).\n", ha->host_no, mb[1])); qla_printk(KERN_INFO, ha, "LIP occured (%x).\n", mb[1]); if (atomic_read(&ha->loop_state) != LOOP_DOWN) { atomic_set(&ha->loop_state, LOOP_DOWN); atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); qla2x00_mark_all_devices_lost(ha); } set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); ha->flags.management_server_logged_in = 0; /* Update AEN queue. */ qla2x00_enqueue_aen(ha, MBA_LIP_OCCURRED, NULL); ha->total_lip_cnt++; break; case MBA_LOOP_UP: /* Loop Up Event */ mb[1] = RD_MAILBOX_REG(ha, reg, 1); ha->link_data_rate = 0; if (IS_QLA2100(ha) || IS_QLA2200(ha)) { link_speed = link_speeds[0]; } else { link_speed = link_speeds[3]; if (mb[1] < 5) link_speed = link_speeds[mb[1]]; ha->link_data_rate = mb[1]; } DEBUG2(printk("scsi(%ld): Asynchronous LOOP UP (%s Gbps).\n", ha->host_no, link_speed)); qla_printk(KERN_INFO, ha, "LOOP UP detected (%s Gbps).\n", link_speed); ha->flags.management_server_logged_in = 0; /* Update AEN queue. */ qla2x00_enqueue_aen(ha, MBA_LOOP_UP, NULL); break; case MBA_LOOP_DOWN: /* Loop Down Event */ DEBUG2(printk("scsi(%ld): Asynchronous LOOP DOWN.\n", ha->host_no)); qla_printk(KERN_INFO, ha, "LOOP DOWN detected.\n"); if (atomic_read(&ha->loop_state) != LOOP_DOWN) { atomic_set(&ha->loop_state, LOOP_DOWN); atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); ha->device_flags |= DFLG_NO_CABLE; qla2x00_mark_all_devices_lost(ha); } ha->flags.management_server_logged_in = 0; ha->link_data_rate = 0; /* Update AEN queue. */ qla2x00_enqueue_aen(ha, MBA_LOOP_DOWN, NULL); break; case MBA_LIP_RESET: /* LIP reset occurred */ mb[1] = RD_MAILBOX_REG(ha, reg, 1); DEBUG2(printk("scsi(%ld): Asynchronous LIP RESET (%x).\n", ha->host_no, mb[1])); qla_printk(KERN_INFO, ha, "LIP reset occured (%x).\n", mb[1]); if (atomic_read(&ha->loop_state) != LOOP_DOWN) { atomic_set(&ha->loop_state, LOOP_DOWN); atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); qla2x00_mark_all_devices_lost(ha); } set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); ha->operating_mode = LOOP; ha->flags.management_server_logged_in = 0; /* Update AEN queue. */ qla2x00_enqueue_aen(ha, MBA_LIP_RESET, NULL); ha->total_lip_cnt++; break; case MBA_POINT_TO_POINT: /* Point-to-Point */ if (IS_QLA2100(ha)) break; DEBUG2(printk("scsi(%ld): Asynchronous P2P MODE received.\n", ha->host_no)); /* * Until there's a transition from loop down to loop up, treat * this as loop down only. */ if (atomic_read(&ha->loop_state) != LOOP_DOWN) { atomic_set(&ha->loop_state, LOOP_DOWN); if (!atomic_read(&ha->loop_down_timer)) atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); qla2x00_mark_all_devices_lost(ha); } if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) { set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); } set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); break; case MBA_CHG_IN_CONNECTION: /* Change in connection mode */ if (IS_QLA2100(ha)) break; mb[1] = RD_MAILBOX_REG(ha, reg, 1); DEBUG2(printk("scsi(%ld): Asynchronous Change In Connection " "received.\n", ha->host_no)); qla_printk(KERN_INFO, ha, "Configuration change detected: value=%x.\n", mb[1]); if (atomic_read(&ha->loop_state) != LOOP_DOWN) { atomic_set(&ha->loop_state, LOOP_DOWN); if (!atomic_read(&ha->loop_down_timer)) atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); qla2x00_mark_all_devices_lost(ha); } set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); break; case MBA_PORT_UPDATE: /* Port database update */ mb[1] = RD_MAILBOX_REG(ha, reg, 1); mb[2] = RD_MAILBOX_REG(ha, reg, 2); /* * If a single remote port just logged into (or logged out of) * us, create a new entry in our rscn fcports list and handle * the event like an RSCN. */ if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA6312(ha) && !IS_QLA6322(ha) && ha->flags.init_done && mb[1] != 0xffff && ((ha->operating_mode == P2P && mb[1] != 0) || (ha->operating_mode != P2P && mb[1] != SNS_FIRST_LOOP_ID)) && (mb[2] == 6 || mb[2] == 7)) { int rval; fc_port_t *rscn_fcport; /* Create new fcport for login. */ rscn_fcport = qla2x00_alloc_rscn_fcport(ha, GFP_ATOMIC); if (rscn_fcport) { DEBUG14(printk("scsi(%ld): Port Update -- " "creating RSCN fcport %p for login.\n", ha->host_no, rscn_fcport)); rscn_fcport->loop_id = mb[1]; rscn_fcport->d_id.b24 = INVALID_PORT_ID; atomic_set(&rscn_fcport->state, FCS_DEVICE_LOST); list_add_tail(&rscn_fcport->list, &ha->rscn_fcports); rval = qla2x00_handle_port_rscn(ha, 0, rscn_fcport, 1); if (rval == QLA_SUCCESS) break; } else { DEBUG14(printk("scsi(%ld): Port Update -- " "-- unable to allocate RSCN fcport " "login.\n", ha->host_no)); } } /* * If PORT UPDATE is global (recieved LIP_OCCURED/LIP_RESET * event etc. earlier indicating loop is down) then process * it. Otherwise ignore it and Wait for RSCN to come in. */ if (atomic_read(&ha->loop_state) != LOOP_DOWN) { DEBUG2(printk("scsi(%ld): Asynchronous PORT UPDATE " "ignored.\n", ha->host_no)); break; } DEBUG2(printk("scsi(%ld): Asynchronous PORT UPDATE.\n", ha->host_no)); DEBUG(printk(KERN_INFO "scsi(%ld): Port database changed %04x %04x.\n", ha->host_no, mb[1], mb[2])); /* * Mark all devices as missing so we will login again. */ atomic_set(&ha->loop_state, LOOP_UP); atomic_set(&ha->loop_down_timer, 0); qla2x00_mark_all_devices_lost(ha); ha->flags.rscn_queue_overflow = 1; set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); /* Update AEN queue. */ qla2x00_enqueue_aen(ha, MBA_PORT_UPDATE, NULL); break; case MBA_RSCN_UPDATE: /* State Change Registration */ mb[1] = RD_MAILBOX_REG(ha, reg, 1); mb[2] = RD_MAILBOX_REG(ha, reg, 2); DEBUG2(printk("scsi(%ld): Asynchronous RSCR UPDATE.\n", ha->host_no)); DEBUG(printk(KERN_INFO "scsi(%ld): RSCN database changed -- %04x %04x.\n", ha->host_no, mb[1], mb[2])); rscn_entry = (mb[1] << 16) | mb[2]; host_pid = (ha->d_id.b.domain << 16) | (ha->d_id.b.area << 8) | ha->d_id.b.al_pa; if (rscn_entry == host_pid) { DEBUG(printk(KERN_INFO "scsi(%ld): Ignoring RSCN update to local host " "port ID (%06x)\n", ha->host_no, host_pid)); break; } rscn_queue_index = ha->rscn_in_ptr + 1; if (rscn_queue_index == MAX_RSCN_COUNT) rscn_queue_index = 0; if (rscn_queue_index != ha->rscn_out_ptr) { ha->rscn_queue[ha->rscn_in_ptr] = rscn_entry; ha->rscn_in_ptr = rscn_queue_index; } else { ha->flags.rscn_queue_overflow = 1; } atomic_set(&ha->loop_state, LOOP_UPDATE); atomic_set(&ha->loop_down_timer, 0); ha->flags.management_server_logged_in = 0; set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); set_bit(RSCN_UPDATE, &ha->dpc_flags); /* Update AEN queue. */ qla2x00_enqueue_aen(ha, MBA_RSCN_UPDATE, &mb[0]); break; /* case MBA_RIO_RESPONSE: */ case MBA_ZIO_RESPONSE: DEBUG2(printk("scsi(%ld): [R|Z]IO update completion.\n", ha->host_no)); DEBUG(printk(KERN_INFO "scsi(%ld): [R|Z]IO update completion.\n", ha->host_no)); qla2x00_process_response_queue(ha); break; } }
TIEXPORT3 int TICALL dusb_send_data(CalcHandle *h, DUSBVirtualPacket *vtl) { DUSBRawPacket raw; int i, r, q; long offset; if (h == NULL) { ticalcs_critical("%s: h is NULL", __FUNCTION__); return ERR_INVALID_HANDLE; } if (vtl == NULL) { ticalcs_critical("%s: vtl is NULL", __FUNCTION__); return ERR_INVALID_PACKET; } memset(&raw, 0, sizeof(raw)); if(vtl->size <= DATA_SIZE - DUSB_DH_SIZE) { // we have a single packet which is the last one, too raw.size = vtl->size + DUSB_DH_SIZE; raw.type = DUSB_RPKT_VIRT_DATA_LAST; raw.data[0] = MSB(MSW(vtl->size)); raw.data[1] = LSB(MSW(vtl->size)); raw.data[2] = MSB(LSW(vtl->size)); raw.data[3] = LSB(LSW(vtl->size)); raw.data[4] = MSB(vtl->type); raw.data[5] = LSB(vtl->type); memcpy(&raw.data[DUSB_DH_SIZE], vtl->data, vtl->size); TRYF(dusb_send(h, &raw)); #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data Final\n\t\t(size = %08x, type = %s)", vtl->size, dusb_vpkt_type2name(vtl->type)); #elif (VPKT_DBG == 1) ticalcs_info(" PC->TI: %s", dusb_vpkt_type2name(vtl->type)); #endif workaround_send(h, &raw, vtl); TRYF(dusb_recv_acknowledge(h)); } else { // we have more than one packet: first packet has data header raw.size = DATA_SIZE; raw.type = DUSB_RPKT_VIRT_DATA; raw.data[0] = MSB(MSW(vtl->size)); raw.data[1] = LSB(MSW(vtl->size)); raw.data[2] = MSB(LSW(vtl->size)); raw.data[3] = LSB(LSW(vtl->size)); raw.data[4] = MSB(vtl->type); raw.data[5] = LSB(vtl->type); memcpy(&raw.data[DUSB_DH_SIZE], vtl->data, DATA_SIZE - DUSB_DH_SIZE); offset = DATA_SIZE - DUSB_DH_SIZE; TRYF(dusb_send(h, &raw)); #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data with Continuation\n\t\t(size = %08x, type = %s)", vtl->size, dusb_vpkt_type2name(vtl->type)); #elif (VPKT_DBG == 1) ticalcs_info(" PC->TI: %s", dusb_vpkt_type2name(vtl->type)); #endif //workaround_send(h, &raw, vtl); TRYF(dusb_recv_acknowledge(h)); // other packets doesn't have data header but last one has a different type q = (vtl->size - offset) / DATA_SIZE; r = (vtl->size - offset) % DATA_SIZE; // send full chunks (no header) for(i = 1; i <= q; i++) { raw.size = DATA_SIZE; raw.type = DUSB_RPKT_VIRT_DATA; memcpy(raw.data, vtl->data + offset, DATA_SIZE); offset += DATA_SIZE; TRYF(dusb_send(h, &raw)); #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data with Continuation"); #endif TRYF(dusb_recv_acknowledge(h)); h->updat->max1 = vtl->size; h->updat->cnt1 += DATA_SIZE; h->updat->pbar(); } // send last chunk (type) //if(r) { raw.size = r; raw.type = DUSB_RPKT_VIRT_DATA_LAST; memcpy(raw.data, vtl->data + offset, r); offset += r; TRYF(dusb_send(h, &raw)); #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data Final"); #endif if (h->model != CALC_TI84P_USB) { workaround_send(h, &raw, vtl); } TRYF(dusb_recv_acknowledge(h)); } } return 0; }
int dusb_send_data(CalcHandle *h, VirtualPacket *vtl) { RawPacket raw = { 0 }; int i, r, q; long offset; if(vtl->size <= DATA_SIZE - DH_SIZE) { // we have a single packet which is the last one, too raw.size = vtl->size + DH_SIZE; raw.type = RPKT_VIRT_DATA_LAST; raw.data[0] = MSB(MSW(vtl->size)); raw.data[1] = LSB(MSW(vtl->size)); raw.data[2] = MSB(LSW(vtl->size)); raw.data[3] = LSB(LSW(vtl->size)); raw.data[4] = MSB(vtl->type); raw.data[5] = LSB(vtl->type); memcpy(&raw.data[DH_SIZE], vtl->data, vtl->size); TRYF(dusb_send(h, &raw)); #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data Final\n\t\t(size = %08x, type = %s)", vtl->size, dusb_vpkt_type2name(vtl->type)); #elif (VPKT_DBG == 1) ticalcs_info(" PC->TI: %s", dusb_vpkt_type2name(vtl->type)); #endif TRYF(dusb_recv_acknowledge(h)); } else { // we have more than one packet: first packet has data header raw.size = DATA_SIZE; raw.type = RPKT_VIRT_DATA; raw.data[0] = MSB(MSW(vtl->size)); raw.data[1] = LSB(MSW(vtl->size)); raw.data[2] = MSB(LSW(vtl->size)); raw.data[3] = LSB(LSW(vtl->size)); raw.data[4] = MSB(vtl->type); raw.data[5] = LSB(vtl->type); memcpy(&raw.data[DH_SIZE], vtl->data, DATA_SIZE - DH_SIZE); offset = DATA_SIZE - DH_SIZE; TRYF(dusb_send(h, &raw)); #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data with Continuation\n\t\t(size = %08x, type = %s)", vtl->size, dusb_vpkt_type2name(vtl->type)); #elif (VPKT_DBG == 1) ticalcs_info(" PC->TI: %s", dusb_vpkt_type2name(vtl->type)); #endif TRYF(dusb_recv_acknowledge(h)); // other packets doesn't have data header but last one has a different type q = (vtl->size - offset) / DATA_SIZE; r = (vtl->size - offset) % DATA_SIZE; // send full chunks (no header) for(i = 1; i <= q; i++) { raw.size = DATA_SIZE; raw.type = RPKT_VIRT_DATA; memcpy(raw.data, vtl->data + offset, DATA_SIZE); offset += DATA_SIZE; TRYF(dusb_send(h, &raw)); #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data with Continuation"); #endif TRYF(dusb_recv_acknowledge(h)); h->updat->max1 = vtl->size; h->updat->cnt1 += DATA_SIZE; h->updat->pbar(); } // send last chunk (type) if(r) { raw.size = r; raw.type = RPKT_VIRT_DATA_LAST; memcpy(raw.data, vtl->data + offset, r); offset += r; TRYF(dusb_send(h, &raw)); #if (VPKT_DBG == 2) ticalcs_info(" PC->TI: Virtual Packet Data Final"); #endif TRYF(dusb_recv_acknowledge(h)); } } return 0; }
/** * qla2300_fw_dump() - Dumps binary data from the 2300 firmware. * @ha: HA context * @hardware_locked: Called with the hardware_lock */ void qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked) { int rval; uint32_t cnt, timer; uint32_t risc_address; uint16_t mb0, mb2; uint32_t stat; device_reg_t __iomem *reg = ha->iobase; uint16_t __iomem *dmp_reg; unsigned long flags; struct qla2300_fw_dump *fw; uint32_t dump_size, data_ram_cnt; risc_address = data_ram_cnt = 0; mb0 = mb2 = 0; flags = 0; if (!hardware_locked) spin_lock_irqsave(&ha->hardware_lock, flags); if (ha->fw_dump != NULL) { qla_printk(KERN_WARNING, ha, "Firmware has been previously dumped (%p) -- ignoring " "request...\n", ha->fw_dump); goto qla2300_fw_dump_failed; } /* Allocate (large) dump buffer. */ dump_size = sizeof(struct qla2300_fw_dump); dump_size += (ha->fw_memory_size - 0x11000) * sizeof(uint16_t); ha->fw_dump_order = get_order(dump_size); ha->fw_dump = (struct qla2300_fw_dump *) __get_free_pages(GFP_ATOMIC, ha->fw_dump_order); if (ha->fw_dump == NULL) { qla_printk(KERN_WARNING, ha, "Unable to allocated memory for firmware dump (%d/%d).\n", ha->fw_dump_order, dump_size); goto qla2300_fw_dump_failed; } fw = ha->fw_dump; rval = QLA_SUCCESS; fw->hccr = RD_REG_WORD(®->hccr); /* Pause RISC. */ WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC); if (IS_QLA2300(ha)) { for (cnt = 30000; (RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) == 0 && rval == QLA_SUCCESS; cnt--) { if (cnt) udelay(100); else rval = QLA_FUNCTION_TIMEOUT; } } else { RD_REG_WORD(®->hccr); /* PCI Posting. */ udelay(10); } if (rval == QLA_SUCCESS) { dmp_reg = (uint16_t __iomem *)(reg + 0); for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++) fw->pbiu_reg[cnt] = RD_REG_WORD(dmp_reg++); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10); for (cnt = 0; cnt < sizeof(fw->risc_host_reg) / 2; cnt++) fw->risc_host_reg[cnt] = RD_REG_WORD(dmp_reg++); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x40); for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) fw->mailbox_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->ctrl_status, 0x40); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->resp_dma_reg) / 2; cnt++) fw->resp_dma_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->ctrl_status, 0x50); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++) fw->dma_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->ctrl_status, 0x00); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0); for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++) fw->risc_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->pcr, 0x2000); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++) fw->risc_gp0_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->pcr, 0x2200); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++) fw->risc_gp1_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->pcr, 0x2400); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++) fw->risc_gp2_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->pcr, 0x2600); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++) fw->risc_gp3_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->pcr, 0x2800); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++) fw->risc_gp4_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->pcr, 0x2A00); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++) fw->risc_gp5_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->pcr, 0x2C00); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++) fw->risc_gp6_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->pcr, 0x2E00); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++) fw->risc_gp7_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->ctrl_status, 0x10); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++) fw->frame_buf_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->ctrl_status, 0x20); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++) fw->fpm_b0_reg[cnt] = RD_REG_WORD(dmp_reg++); WRT_REG_WORD(®->ctrl_status, 0x30); dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++) fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++); /* Reset RISC. */ WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); for (cnt = 0; cnt < 30000; cnt++) { if ((RD_REG_WORD(®->ctrl_status) & CSR_ISP_SOFT_RESET) == 0) break; udelay(10); } } if (!IS_QLA2300(ha)) { for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 && rval == QLA_SUCCESS; cnt--) { if (cnt) udelay(100); else rval = QLA_FUNCTION_TIMEOUT; } } if (rval == QLA_SUCCESS) { /* Get RISC SRAM. */ risc_address = 0x800; WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD); clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); } for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS; cnt++, risc_address++) { WRT_MAILBOX_REG(ha, reg, 1, (uint16_t)risc_address); WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); for (timer = 6000000; timer; timer--) { /* Check for pending interrupts. */ stat = RD_REG_DWORD(®->u.isp2300.host_status); if (stat & HSR_RISC_INT) { stat &= 0xff; if (stat == 0x1 || stat == 0x2) { set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); mb0 = RD_MAILBOX_REG(ha, reg, 0); mb2 = RD_MAILBOX_REG(ha, reg, 2); /* Release mailbox registers. */ WRT_REG_WORD(®->semaphore, 0); WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); RD_REG_WORD(®->hccr); break; } else if (stat == 0x10 || stat == 0x11) { set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); mb0 = RD_MAILBOX_REG(ha, reg, 0); mb2 = RD_MAILBOX_REG(ha, reg, 2); WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); RD_REG_WORD(®->hccr); break; } /* clear this intr; it wasn't a mailbox intr */ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); RD_REG_WORD(®->hccr); } udelay(5); } if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb0 & MBS_MASK; fw->risc_ram[cnt] = mb2; } else { rval = QLA_FUNCTION_FAILED; } } if (rval == QLA_SUCCESS) { /* Get stack SRAM. */ risc_address = 0x10000; WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED); clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); } for (cnt = 0; cnt < sizeof(fw->stack_ram) / 2 && rval == QLA_SUCCESS; cnt++, risc_address++) { WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address)); WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address)); WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); for (timer = 6000000; timer; timer--) { /* Check for pending interrupts. */ stat = RD_REG_DWORD(®->u.isp2300.host_status); if (stat & HSR_RISC_INT) { stat &= 0xff; if (stat == 0x1 || stat == 0x2) { set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); mb0 = RD_MAILBOX_REG(ha, reg, 0); mb2 = RD_MAILBOX_REG(ha, reg, 2); /* Release mailbox registers. */ WRT_REG_WORD(®->semaphore, 0); WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); RD_REG_WORD(®->hccr); break; } else if (stat == 0x10 || stat == 0x11) { set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); mb0 = RD_MAILBOX_REG(ha, reg, 0); mb2 = RD_MAILBOX_REG(ha, reg, 2); WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); RD_REG_WORD(®->hccr); break; } /* clear this intr; it wasn't a mailbox intr */ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); RD_REG_WORD(®->hccr); } udelay(5); } if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb0 & MBS_MASK; fw->stack_ram[cnt] = mb2; } else { rval = QLA_FUNCTION_FAILED; } } if (rval == QLA_SUCCESS) { /* Get data SRAM. */ risc_address = 0x11000; data_ram_cnt = ha->fw_memory_size - risc_address + 1; WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED); clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); } for (cnt = 0; cnt < data_ram_cnt && rval == QLA_SUCCESS; cnt++, risc_address++) { WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address)); WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address)); WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT); for (timer = 6000000; timer; timer--) { /* Check for pending interrupts. */ stat = RD_REG_DWORD(®->u.isp2300.host_status); if (stat & HSR_RISC_INT) { stat &= 0xff; if (stat == 0x1 || stat == 0x2) { set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); mb0 = RD_MAILBOX_REG(ha, reg, 0); mb2 = RD_MAILBOX_REG(ha, reg, 2); /* Release mailbox registers. */ WRT_REG_WORD(®->semaphore, 0); WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); RD_REG_WORD(®->hccr); break; } else if (stat == 0x10 || stat == 0x11) { set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); mb0 = RD_MAILBOX_REG(ha, reg, 0); mb2 = RD_MAILBOX_REG(ha, reg, 2); WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); RD_REG_WORD(®->hccr); break; } /* clear this intr; it wasn't a mailbox intr */ WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT); RD_REG_WORD(®->hccr); } udelay(5); } if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { rval = mb0 & MBS_MASK; fw->data_ram[cnt] = mb2; } else { rval = QLA_FUNCTION_FAILED; } } if (rval != QLA_SUCCESS) { qla_printk(KERN_WARNING, ha, "Failed to dump firmware (%x)!!!\n", rval); free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order); ha->fw_dump = NULL; } else { qla_printk(KERN_INFO, ha, "Firmware dump saved to temp buffer (%ld/%p).\n", ha->host_no, ha->fw_dump); } qla2300_fw_dump_failed: if (!hardware_locked) spin_unlock_irqrestore(&ha->hardware_lock, flags); }
int qlcnic_sriov_get_vf_vport_info(struct qlcnic_adapter *adapter, struct qlcnic_info *npar_info, u16 vport_id) { struct device *dev = &adapter->pdev->dev; struct qlcnic_cmd_args cmd; int err; u32 status; err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO); if (err) return err; cmd.req.arg[1] = vport_id << 16 | 0x1; err = qlcnic_issue_cmd(adapter, &cmd); if (err) { dev_err(&adapter->pdev->dev, "Failed to get vport info, err=%d\n", err); qlcnic_free_mbx_args(&cmd); return err; } status = cmd.rsp.arg[2] & 0xffff; if (status & BIT_0) npar_info->min_tx_bw = MSW(cmd.rsp.arg[2]); if (status & BIT_1) npar_info->max_tx_bw = LSW(cmd.rsp.arg[3]); if (status & BIT_2) npar_info->max_tx_ques = MSW(cmd.rsp.arg[3]); if (status & BIT_3) npar_info->max_tx_mac_filters = LSW(cmd.rsp.arg[4]); if (status & BIT_4) npar_info->max_rx_mcast_mac_filters = MSW(cmd.rsp.arg[4]); if (status & BIT_5) npar_info->max_rx_ucast_mac_filters = LSW(cmd.rsp.arg[5]); if (status & BIT_6) npar_info->max_rx_ip_addr = MSW(cmd.rsp.arg[5]); if (status & BIT_7) npar_info->max_rx_lro_flow = LSW(cmd.rsp.arg[6]); if (status & BIT_8) npar_info->max_rx_status_rings = MSW(cmd.rsp.arg[6]); if (status & BIT_9) npar_info->max_rx_buf_rings = LSW(cmd.rsp.arg[7]); npar_info->max_rx_ques = MSW(cmd.rsp.arg[7]); npar_info->max_tx_vlan_keys = LSW(cmd.rsp.arg[8]); npar_info->max_local_ipv6_addrs = MSW(cmd.rsp.arg[8]); npar_info->max_remote_ipv6_addrs = LSW(cmd.rsp.arg[9]); dev_info(dev, "\n\tmin_tx_bw: %d, max_tx_bw: %d max_tx_ques: %d,\n" "\tmax_tx_mac_filters: %d max_rx_mcast_mac_filters: %d,\n" "\tmax_rx_ucast_mac_filters: 0x%x, max_rx_ip_addr: %d,\n" "\tmax_rx_lro_flow: %d max_rx_status_rings: %d,\n" "\tmax_rx_buf_rings: %d, max_rx_ques: %d, max_tx_vlan_keys %d\n" "\tlocal_ipv6_addr: %d, remote_ipv6_addr: %d\n", npar_info->min_tx_bw, npar_info->max_tx_bw, npar_info->max_tx_ques, npar_info->max_tx_mac_filters, npar_info->max_rx_mcast_mac_filters, npar_info->max_rx_ucast_mac_filters, npar_info->max_rx_ip_addr, npar_info->max_rx_lro_flow, npar_info->max_rx_status_rings, npar_info->max_rx_buf_rings, npar_info->max_rx_ques, npar_info->max_tx_vlan_keys, npar_info->max_local_ipv6_addrs, npar_info->max_remote_ipv6_addrs); qlcnic_free_mbx_args(&cmd); return err; }